/*
 Highcharts JS v3.0.2 (2013-06-05)

 (c) 2009-2013 Torstein Hønsi

 License: www.highcharts.com/license
 */
(function () {
  function v(a, b) {
    var c;
    a || (a = {});
    for (c in b) {
      a[c] = b[c];
    }
    return a
  }

  function x() {
    var a, b = arguments.length, c = {}, d = function (a, b) {
      var c, h;
      for (h in b) {
        b.hasOwnProperty(h) && (c = b[h], typeof a !== "object"
        && (a = {}), a[h] = c && typeof c === "object"
        && Object.prototype.toString.call(c) !== "[object Array]"
        && typeof c.nodeType !== "number" ? d(a[h] || {}, c) : b[h]);
      }
      return a
    };
    for (a = 0; a < b; a++) {
      c = d(c, arguments[a]);
    }
    return c
  }

  function u(a, b) {
    return parseInt(a, b || 10)
  }

  function fa(a) {
    return typeof a === "string"
  }

  function V(a) {
    return typeof a ===
        "object"
  }

  function Da(a) {
    return Object.prototype.toString.call(a) === "[object Array]"
  }

  function Ea(a) {
    return typeof a === "number"
  }

  function ka(a) {
    return I.log(a) / I.LN10
  }

  function da(a) {
    return I.pow(10, a)
  }

  function ga(a, b) {
    for (var c = a.length; c--;) {
      if (a[c] === b) {
        a.splice(c, 1);
        break
      }
    }
  }

  function r(a) {
    return a !== y && a !== null
  }

  function A(a, b, c) {
    var d, e;
    if (fa(b)) {
      r(c) ? a.setAttribute(b, c) : a && a.getAttribute
          && (e = a.getAttribute(b));
    } else if (r(b) && V(b)) {
      for (d in
          b) {
        a.setAttribute(d, b[d]);
      }
    }
    return e
  }

  function ha(a) {
    return Da(a) ?
        a : [a]
  }

  function o() {
    var a = arguments, b, c, d = a.length;
    for (b = 0; b < d; b++) {
      if (c = a[b], typeof c !== "undefined" && c
      !== null) {
        return c
      }
    }
  }

  function L(a, b) {
    if (Fa && b && b.opacity !== y) {
      b.filter = "alpha(opacity=" + b.opacity
          * 100 + ")";
    }
    v(a.style, b)
  }

  function U(a, b, c, d, e) {
    a = z.createElement(a);
    b && v(a, b);
    e && L(a, {padding: 0, border: S, margin: 0});
    c && L(a, c);
    d && d.appendChild(a);
    return a
  }

  function ea(a, b) {
    var c = function () {
    };
    c.prototype = new a;
    v(c.prototype, b);
    return c
  }

  function ua(a, b, c, d) {
    var e = N.lang, f = b === -1 ? ((a || 0).toString().split(".")[1] ||
        "").length : isNaN(b = Q(b)) ? 2 : b,
        b = c === void 0 ? e.decimalPoint : c,
        d = d === void 0 ? e.thousandsSep : d, e = a < 0 ? "-" : "",
        c = String(u(a = Q(+a || 0).toFixed(f))),
        g = c.length > 3 ? c.length % 3 : 0;
    return e + (g ? c.substr(0, g) + d : "") + c.substr(g).replace(
        /(\d{3})(?=\d)/g, "$1" + d) + (f ? b + Q(a - c).toFixed(f).slice(2)
        : "")
  }

  function va(a, b) {
    return Array((b || 2) + 1 - String(a).length).join(0) + a
  }

  function zb(a, b, c) {
    var d = a[b];
    a[b] = function () {
      var a = Array.prototype.slice.call(arguments);
      a.unshift(d);
      return c.apply(this, a)
    }
  }

  function wa(a, b) {
    for (var c = "{",
        d = !1, e, f, g, h, i, j = []; (c = a.indexOf(c)) !== -1;) {
      e = a.slice(0, c);
      if (d) {
        f = e.split(":");
        g = f.shift().split(".");
        i = g.length;
        e = b;
        for (h = 0; h < i; h++) {
          e = e[g[h]];
        }
        if (f.length) {
          f = f.join(
              ":"), g = /\.([0-9])/, h = N.lang, i = void 0, /f$/.test(f)
              ? (i = (i = f.match(g)) ? i[1] : -1, e = ua(e, i, h.decimalPoint,
                  f.indexOf(",") > -1 ? h.thousandsSep : "")) : e = Ua(f, e)
        }
      }
      j.push(e);
      a = a.slice(c + 1);
      c = (d = !d) ? "}" : "{"
    }
    j.push(a);
    return j.join("")
  }

  function ib(a, b, c, d) {
    var e, c = o(c, 1);
    e = a / c;
    b || (b = [1, 2, 2.5, 5, 10], d && d.allowDecimals === !1 && (c === 1
        ? b = [1, 2, 5, 10] : c <= 0.1 && (b =
        [1 / c])));
    for (d = 0; d < b.length; d++) {
      if (a = b[d], e <= (b[d] + (b[d + 1]
          || b[d])) / 2) {
        break;
      }
    }
    a *= c;
    return a
  }

  function Ab(a, b) {
    var c = b || [
      [Bb, [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
      [jb, [1, 2, 5, 10, 15, 30]],
      [Va, [1, 2, 5, 10, 15, 30]],
      [Oa, [1, 2, 3, 4, 6, 8, 12]],
      [oa, [1, 2]],
      [Wa, [1, 2]],
      [Pa, [1, 2, 3, 4, 6]],
      [xa, null]
    ], d = c[c.length - 1], e = E[d[0]], f = d[1], g;
    for (g = 0; g < c.length; g++) {
      if (d = c[g], e = E[d[0]], f = d[1], c[g + 1]
      && a <= (e * f[f.length - 1] + E[c[g + 1][0]]) / 2) {
        break;
      }
    }
    e === E[xa] && a < 5 * e && (f = [1, 2, 5]);
    e === E[xa] && a < 5 * e && (f = [1, 2, 5]);
    c = ib(a / e, f);
    return {
      unitRange: e, count: c,
      unitName: d[0]
    }
  }

  function Cb(a, b, c, d) {
    var e = [], f = {}, g = N.global.useUTC, h, i = new Date(b),
        j = a.unitRange, k = a.count;
    if (r(b)) {
      j >= E[jb] && (i.setMilliseconds(0), i.setSeconds(
          j >= E[Va] ? 0 : k * T(i.getSeconds() / k)));
      if (j >= E[Va]) {
        i[Db](j >= E[Oa] ? 0 : k * T(i[kb]() / k));
      }
      if (j >= E[Oa]) {
        i[Eb](j >= E[oa] ? 0 : k * T(i[lb]() / k));
      }
      if (j >= E[oa]) {
        i[mb](j >= E[Pa] ? 1 : k * T(i[Qa]() / k));
      }
      j >= E[Pa] && (i[Fb](j >= E[xa] ? 0 : k * T(i[Xa]() / k)), h = i[Ya]());
      j >= E[xa] && (h -= h % k, i[Gb](h));
      if (j === E[Wa]) {
        i[mb](i[Qa]() - i[nb]() + o(d, 1));
      }
      b = 1;
      h = i[Ya]();
      for (var d = i.getTime(), m = i[Xa](),
          l = i[Qa](),
          p = g ? 0 : (864E5 + i.getTimezoneOffset() * 6E4) % 864E5;
          d < c;) {
        e.push(d), j === E[xa] ? d = Za(h + b * k, 0) : j === E[Pa]
            ? d = Za(h, m + b * k) : !g && (j === E[oa] || j === E[Wa])
                ? d = Za(
                    h, m, l + b * k * (j === E[oa] ? 1 : 7)) : d += j * k, b++;
      }
      e.push(d);
      n(ob(e, function (a) {
        return j <= E[Oa] && a % E[oa] === p
      }), function (a) {
        f[a] = oa
      })
    }
    e.info = v(a, {higherRanks: f, totalRange: j * k});
    return e
  }

  function Hb() {
    this.symbol = this.color = 0
  }

  function Ib(a, b) {
    var c = a.length, d, e;
    for (e = 0; e < c; e++) {
      a[e].ss_i = e;
    }
    a.sort(function (a, c) {
      d = b(a, c);
      return d === 0 ? a.ss_i - c.ss_i : d
    });
    for (e = 0; e < c; e++) {
      delete a[e].ss_i
    }
  }

  function Ga(a) {
    for (var b = a.length, c = a[0]; b--;) {
      a[b] < c && (c = a[b]);
    }
    return c
  }

  function pa(a) {
    for (var b = a.length, c = a[0]; b--;) {
      a[b] > c && (c = a[b]);
    }
    return c
  }

  function Ha(a, b) {
    for (var c in a) {
      a[c] && a[c] !== b && a[c].destroy
      && a[c].destroy(), delete a[c]
    }
  }

  function Ra(a) {
    $a || ($a = U(ya));
    a && $a.appendChild(a);
    $a.innerHTML = ""
  }

  function qa(a, b) {
    var c = "Highcharts error #" + a + ": www.highcharts.com/errors/" + a;
    if (b) {
      throw c;
    } else {
      O.console && console.log(c)
    }
  }

  function ia(a) {
    return parseFloat(a.toPrecision(14))
  }

  function Ia(a, b) {
    za = o(a, b.animation)
  }

  function Jb() {
    var a = N.global.useUTC, b = a ? "getUTC" : "get", c = a ? "setUTC" : "set";
    Za = a ? Date.UTC : function (a, b, c, g, h, i) {
      return (new Date(a, b, o(c, 1), o(g, 0), o(h, 0), o(i, 0))).getTime()
    };
    kb = b + "Minutes";
    lb = b + "Hours";
    nb = b + "Day";
    Qa = b + "Date";
    Xa = b + "Month";
    Ya = b + "FullYear";
    Db = c + "Minutes";
    Eb = c + "Hours";
    mb = c + "Date";
    Fb = c + "Month";
    Gb = c + "FullYear"
  }

  function ra() {
  }

  function Ja(a, b, c, d) {
    this.axis = a;
    this.pos = b;
    this.type = c || "";
    this.isNew = !0;
    !c && !d && this.addLabel()
  }

  function pb(a, b) {
    this.axis = a;
    if (b) {
      this.options = b, this.id = b.id
    }
  }

  function Kb(a, b, c, d, e, f) {
    var g = a.chart.inverted;
    this.axis = a;
    this.isNegative = c;
    this.options = b;
    this.x = d;
    this.stack = e;
    this.percent = f === "percent";
    this.alignOptions = {
      align: b.align || (g ? c ? "left" : "right" : "center"),
      verticalAlign: b.verticalAlign || (g ? "middle" : c ? "bottom" : "top"),
      y: o(b.y, g ? 4 : c ? 14 : -6),
      x: o(b.x, g ? c ? -6 : 6 : 0)
    };
    this.textAlign = b.textAlign || (g ? c ? "right" : "left" : "center")
  }

  function ab() {
    this.init.apply(this, arguments)
  }

  function qb() {
    this.init.apply(this, arguments)
  }

  function rb(a, b) {
    this.init(a, b)
  }

  function sb(a, b) {
    this.init(a,
        b)
  }

  function tb() {
    this.init.apply(this, arguments)
  }

  var y, z = document, O = window, I = Math, t = I.round, T = I.floor,
      ja = I.ceil, q = I.max, K = I.min, Q = I.abs, Y = I.cos, ca = I.sin,
      Ka = I.PI, bb = Ka * 2 / 360, Aa = navigator.userAgent, Lb = O.opera,
      Fa = /msie/i.test(Aa) && !Lb, cb = z.documentMode === 8,
      db = /AppleWebKit/.test(Aa), eb = /Firefox/.test(Aa),
      Mb = /(Mobile|Android|Windows Phone)/.test(Aa),
      sa = "http://www.w3.org/2000/svg",
      Z = !!z.createElementNS && !!z.createElementNS(sa, "svg").createSVGRect,
      Sb = eb && parseInt(Aa.split("Firefox/")[1], 10) < 4,
      $ = !Z && !Fa && !!z.createElement("canvas").getContext, Sa,
      fb = z.documentElement.ontouchstart !== y, Nb = {}, ub = 0, $a, N, Ua, za,
      vb, E, ta = function () {
      }, Ba = [], ya = "div", S = "none",
      Ob = "rgba(192,192,192," + (Z ? 1.0E-4 : 0.002) + ")", Bb = "millisecond",
      jb = "second", Va = "minute", Oa = "hour", oa = "day", Wa = "week",
      Pa = "month", xa = "year", Pb = "stroke-width", Za, kb, lb, nb, Qa, Xa,
      Ya, Db, Eb, mb, Fb, Gb, aa = {};
  O.Highcharts = O.Highcharts ? qa(16, !0) : {};
  Ua = function (a, b, c) {
    if (!r(b) || isNaN(b)) {
      return "Invalid date";
    }
    var a = o(a, "%Y-%m-%d %H:%M:%S"), d = new Date(b), e, f = d[lb](),
        g = d[nb](),
        h = d[Qa](), i = d[Xa](), j = d[Ya](), k = N.lang, m = k.weekdays,
        d = v({
          a: m[g].substr(0, 3),
          A: m[g],
          d: va(h),
          e: h,
          b: k.shortMonths[i],
          B: k.months[i],
          m: va(i + 1),
          y: j.toString().substr(2, 2),
          Y: j,
          H: va(f),
          I: va(f % 12 || 12),
          l: f % 12 || 12,
          M: va(d[kb]()),
          p: f < 12 ? "AM" : "PM",
          P: f < 12 ? "am" : "pm",
          S: va(d.getSeconds()),
          L: va(t(b % 1E3), 3)
        }, Highcharts.dateFormats);
    for (e in d) {
      for (; a.indexOf("%" + e) !== -1;) {
        a = a.replace("%" + e,
            typeof d[e] === "function" ? d[e](b) : d[e]);
      }
    }
    return c ? a.substr(0, 1).toUpperCase() + a.substr(1) : a
  };
  Hb.prototype = {
    wrapColor: function (a) {
      if (this.color >=
          a) {
        this.color = 0
      }
    }, wrapSymbol: function (a) {
      if (this.symbol >= a) {
        this.symbol = 0
      }
    }
  };
  E = function () {
    for (var a = 0, b = arguments, c = b.length, d = {}; a < c;
        a++) {
      d[b[a++]] = b[a];
    }
    return d
  }(Bb, 1, jb, 1E3, Va, 6E4, Oa, 36E5, oa, 864E5, Wa, 6048E5, Pa, 26784E5, xa,
      31556952E3);
  vb = {
    init: function (a, b, c) {
      var b = b || "", d = a.shift, e = b.indexOf("C") > -1, f = e ? 7 : 3, g,
          b = b.split(" "), c = [].concat(c), h, i, j = function (a) {
            for (g = a.length; g--;) {
              a[g] === "M" && a.splice(g + 1, 0, a[g + 1],
                  a[g + 2], a[g + 1], a[g + 2])
            }
          };
      e && (j(b), j(c));
      a.isArea && (h = b.splice(b.length - 6, 6), i = c.splice(c.length -
          6, 6));
      if (d <= c.length / f) {
        for (; d--;) {
          c = [].concat(c).splice(0, f).concat(
              c);
        }
      }
      a.shift = 0;
      if (b.length) {
        for (a = c.length; b.length < a;) {
          d = [].concat(
              b).splice(b.length - f, f), e && (d[f - 6] = d[f - 2], d[f
          - 5] = d[f
          - 1]), b = b.concat(d);
        }
      }
      h && (b = b.concat(h), c = c.concat(i));
      return [b, c]
    }, step: function (a, b, c, d) {
      var e = [], f = a.length;
      if (c === 1) {
        e = d;
      } else if (f === b.length && c < 1) {
        for (;
            f--;) {
          d = parseFloat(a[f]), e[f] = isNaN(d) ? a[f] : c
              * parseFloat(b[f] - d) + d;
        }
      } else {
        e = b;
      }
      return e
    }
  };
  (function (a) {
    O.HighchartsAdapter = O.HighchartsAdapter || a && {
      init: function (b) {
        var c =
            a.fx, d = c.step, e, f = a.Tween, g = f && f.propHooks;
        e = a.cssHooks.opacity;
        a.extend(a.easing, {
          easeOutQuad: function (a, b, c, d, e) {
            return -d * (b /= e) * (b - 2) + c
          }
        });
        a.each(["cur", "_default", "width", "height", "opacity"],
            function (a, b) {
              var e = d, k, m;
              b === "cur" ? e = c.prototype : b === "_default" && f
                  && (e = g[b], b = "set");
              (k = e[b]) && (e[b] = function (c) {
                c = a ? c : this;
                m = c.elem;
                return m.attr ? m.attr(c.prop, b === "cur" ? y : c.now)
                    : k.apply(this, arguments)
              })
            });
        zb(e, "get", function (a, b, c) {
          return b.attr ? b.opacity || 0 : a.call(this, b, c)
        });
        e = function (a) {
          var c = a.elem,
              d;
          if (!a.started) {
            d = b.init(c, c.d,
                c.toD), a.start = d[0], a.end = d[1], a.started = !0;
          }
          c.attr("d", b.step(a.start, a.end, a.pos, c.toD))
        };
        f ? g.d = {set: e} : d.d = e;
        this.each = Array.prototype.forEach ? function (a, b) {
          return Array.prototype.forEach.call(a, b)
        } : function (a, b) {
          for (var c = 0, d = a.length; c < d; c++) {
            if (b.call(a[c], a[c], c, a)
                === !1) {
              return c
            }
          }
        };
        a.fn.highcharts = function () {
          var a = "Chart", b = arguments, c, d;
          fa(b[0]) && (a = b[0], b = Array.prototype.slice.call(b, 1));
          c = b[0];
          if (c !== y) {
            c.chart = c.chart
                || {}, c.chart.renderTo = this[0], new Highcharts[a](c,
                b[1]), d = this;
          }
          c === y && (d = Ba[A(this[0], "data-highcharts-chart")]);
          return d
        }
      },
      getScript: a.getScript,
      inArray: a.inArray,
      adapterRun: function (b, c) {
        return a(b)[c]()
      },
      grep: a.grep,
      map: function (a, c) {
        for (var d = [], e = 0, f = a.length; e < f; e++) {
          d[e] = c.call(a[e],
              a[e], e, a);
        }
        return d
      },
      offset: function (b) {
        return a(b).offset()
      },
      addEvent: function (b, c, d) {
        a(b).bind(c, d)
      },
      removeEvent: function (b, c, d) {
        var e = z.removeEventListener ? "removeEventListener" : "detachEvent";
        z[e] && b && !b[e] && (b[e] = function () {
        });
        a(b).unbind(c, d)
      },
      fireEvent: function (b, c, d, e) {
        var f = a.Event(c), g = "detached" + c, h;
        !Fa && d && (delete d.layerX, delete d.layerY);
        v(f, d);
        b[c] && (b[g] = b[c], b[c] = null);
        a.each(["preventDefault", "stopPropagation"], function (a, b) {
          var c = f[b];
          f[b] = function () {
            try {
              c.call(f)
            } catch (a) {
              b === "preventDefault" && (h = !0)
            }
          }
        });
        a(b).trigger(f);
        b[g] && (b[c] = b[g], b[g] = null);
        e && !f.isDefaultPrevented() && !h && e(f)
      },
      washMouseEvent: function (a) {
        var c = a.originalEvent || a;
        if (c.pageX === y) {
          c.pageX = a.pageX, c.pageY = a.pageY;
        }
        return c
      },
      animate: function (b, c, d) {
        var e = a(b);
        if (!b.style) {
          b.style =
              {};
        }
        if (c.d) {
          b.toD = c.d, c.d = 1;
        }
        e.stop();
        e.animate(c, d)
      },
      stop: function (b) {
        a(b).stop()
      }
    }
  })(O.jQuery);
  var W = O.HighchartsAdapter, M = W || {};
  W && W.init.call(W, vb);
  var gb = M.adapterRun, Tb = M.getScript, la = M.inArray, n = M.each,
      ob = M.grep, Ub = M.offset, La = M.map, J = M.addEvent,
      ba = M.removeEvent, D = M.fireEvent, Qb = M.washMouseEvent,
      wb = M.animate, Ta = M.stop, M = {
        enabled: !0,
        align: "center",
        x: 0,
        y: 15,
        style: {
          color: "#666",
          cursor: "default",
          fontSize: "11px",
          lineHeight: "14px"
        }
      };
  N = {
    colors: "#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(
        ","),
    symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
    lang: {
      loading: "Loading...",
      months: "January,February,March,April,May,June,July,August,September,October,November,December".split(
          ","),
      shortMonths: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),
      weekdays: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(
          ","),
      decimalPoint: ".",
      numericSymbols: "k,M,G,T,P,E".split(","),
      resetZoom: "Reset zoom",
      resetZoomTitle: "Reset zoom level 1:1",
      thousandsSep: ","
    },
    global: {
      useUTC: !0,
      canvasToolsURL: "http://code.highcharts.com/3.0.2/modules/canvas-tools.js",
      VMLRadialGradientURL: "http://code.highcharts.com/3.0.2/gfx/vml-radial-gradient.png"
    },
    chart: {
      borderColor: "#4572A7",
      borderRadius: 5,
      defaultSeriesType: "line",
      ignoreHiddenSeries: !0,
      spacingTop: 10,
      spacingRight: 10,
      spacingBottom: 15,
      spacingLeft: 10,
      style: {
        fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
        fontSize: "12px"
      },
      backgroundColor: "#FFFFFF",
      plotBorderColor: "#C0C0C0",
      resetZoomButton: {
        theme: {zIndex: 20},
        position: {align: "right", x: -10, y: 10}
      }
    },
    title: {
      text: "Chart title",
      align: "center",
      y: 15,
      style: {color: "#274b6d", fontSize: "16px"}
    },
    subtitle: {text: "", align: "center", y: 30, style: {color: "#4d759e"}},
    plotOptions: {
      line: {
        allowPointSelect: !1,
        showCheckbox: !1,
        animation: {duration: 1E3},
        events: {},
        lineWidth: 2,
        marker: {
          enabled: !0,
          lineWidth: 0,
          radius: 4,
          lineColor: "#FFFFFF",
          states: {
            hover: {enabled: !0},
            select: {fillColor: "#FFFFFF", lineColor: "#000000", lineWidth: 2}
          }
        },
        point: {events: {}},
        dataLabels: x(M, {
          enabled: !1, formatter: function () {
            return ua(this.y,
                -1)
          }, verticalAlign: "bottom", y: 0
        }),
        cropThreshold: 300,
        pointRange: 0,
        showInLegend: !0,
        states: {hover: {marker: {}}, select: {marker: {}}},
        stickyTracking: !0
      }
    },
    labels: {style: {position: "absolute", color: "#3E576F"}},
    legend: {
      enabled: !0,
      align: "center",
      layout: "horizontal",
      labelFormatter: function () {
        return this.name
      },
      borderWidth: 1,
      borderColor: "#909090",
      borderRadius: 5,
      navigation: {activeColor: "#274b6d", inactiveColor: "#CCC"},
      shadow: !1,
      itemStyle: {cursor: "pointer", color: "#274b6d", fontSize: "12px"},
      itemHoverStyle: {color: "#000"},
      itemHiddenStyle: {color: "#CCC"},
      itemCheckboxStyle: {position: "absolute", width: "13px", height: "13px"},
      symbolWidth: 16,
      symbolPadding: 5,
      verticalAlign: "bottom",
      x: 0,
      y: 0,
      title: {style: {fontWeight: "bold"}}
    },
    loading: {
      labelStyle: {fontWeight: "bold", position: "relative", top: "1em"},
      style: {
        position: "absolute",
        backgroundColor: "white",
        opacity: 0.5,
        textAlign: "center"
      }
    },
    tooltip: {
      enabled: !0,
      animation: Z,
      backgroundColor: "rgba(255, 255, 255, .85)",
      borderWidth: 1,
      borderRadius: 3,
      dateTimeLabelFormats: {
        millisecond: "%A, %b %e, %H:%M:%S.%L",
        second: "%A, %b %e, %H:%M:%S",
        minute: "%A, %b %e, %H:%M",
        hour: "%A, %b %e, %H:%M",
        day: "%A, %b %e, %Y",
        week: "Week from %A, %b %e, %Y",
        month: "%B %Y",
        year: "%Y"
      },
      headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
      pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',
      shadow: !0,
      snap: Mb ? 25 : 10,
      style: {
        color: "#333333",
        cursor: "default",
        fontSize: "12px",
        padding: "8px",
        whiteSpace: "nowrap"
      }
    },
    credits: {
      enabled: !0,
      text: "Highcharts.com",
      href: "http://www.highcharts.com",
      position: {align: "right", x: -10, verticalAlign: "bottom", y: -5},
      style: {cursor: "pointer", color: "#909090", fontSize: "9px"}
    }
  };
  var X = N.plotOptions, W = X.line;
  Jb();
  var ma = function (a) {
    var b = [], c, d;
    (function (a) {
      a && a.stops ? d = La(a.stops, function (a) {
            return ma(a[1])
          })
          : (c = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(
          a)) ? b = [u(c[1]), u(c[2]), u(c[3]), parseFloat(c[4], 10)]
          : (c = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))
              ? b = [u(c[1], 16), u(c[2], 16), u(c[3],
                  16), 1]
              : (c = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(
              a)) && (b = [u(c[1]), u(c[2]), u(c[3]), 1])
    })(a);
    return {
      get: function (c) {
        var f;
        d ? (f = x(a), f.stops = [].concat(f.stops), n(d, function (a, b) {
          f.stops[b] = [f.stops[b][0], a.get(c)]
        })) : f = b && !isNaN(b[0]) ? c === "rgb" ? "rgb(" + b[0] + "," + b[1]
            + "," + b[2] + ")" : c === "a" ? b[3] : "rgba(" + b.join(",") + ")"
            : a;
        return f
      }, brighten: function (a) {
        if (d) {
          n(d, function (b) {
            b.brighten(a)
          });
        } else if (Ea(a) && a !== 0) {
          var c;
          for (c = 0; c < 3; c++) {
            b[c] += u(a * 255), b[c] < 0
            && (b[c] = 0), b[c] > 255 &&
            (b[c] = 255)
          }
        }
        return this
      }, rgba: b, setOpacity: function (a) {
        b[3] = a;
        return this
      }
    }
  };
  ra.prototype = {
    init: function (a, b) {
      this.element = b === "span" ? U(b) : z.createElementNS(sa, b);
      this.renderer = a;
      this.attrSetters = {}
    }, opacity: 1, animate: function (a, b, c) {
      b = o(b, za, !0);
      Ta(this);
      if (b) {
        b = x(b);
        if (c) {
          b.complete = c;
        }
        wb(this, a, b)
      } else {
        this.attr(a), c && c()
      }
    }, attr: function (a, b) {
      var c, d, e, f, g = this.element, h = g.nodeName.toLowerCase(),
          i = this.renderer, j, k = this.attrSetters, m = this.shadows, l, p,
          s = this;
      fa(a) && r(b) && (c = a, a = {}, a[c] = b);
      if (fa(a)) {
        c =
            a, h === "circle" ? c = {
          x: "cx",
          y: "cy"
        }[c] || c : c === "strokeWidth" && (c = "stroke-width"), s = A(g, c)
            || this[c] || 0, c !== "d" && c !== "visibility" && (s = parseFloat(
            s));
      } else {
        for (c in a) {
          if (j = !1, d = a[c], e = k[c] && k[c].call(this, d, c), e
          !== !1) {
            e !== y && (d = e);
            if (c === "d") {
              d && d.join && (d = d.join(" ")), /(NaN| {2}|^$)/.test(
                  d) && (d = "M 0 0");
            } else if (c === "x" && h
                === "text") {
              for (e = 0; e < g.childNodes.length;
                  e++) {
                f = g.childNodes[e], A(f, "x") === A(g, "x") && A(f, "x",
                    d);
              }
            } else if (this.rotation && (c === "x" || c
                === "y")) {
              p = !0;
            } else if (c === "fill") {
              d = i.color(d, g,
                  c);
            } else if (h ===
                "circle" && (c === "x" || c === "y")) {
              c = {
                x: "cx",
                y: "cy"
              }[c] || c;
            } else if (h === "rect" && c === "r") {
              A(g, {
                rx: d,
                ry: d
              }), j = !0;
            } else if (c === "translateX" || c === "translateY" || c
                === "rotation" || c === "verticalAlign" || c === "scaleX" || c
                === "scaleY") {
              j = p = !0;
            } else if (c === "stroke") {
              d = i.color(d,
                  g, c);
            } else if (c
                === "dashstyle") {
              if (c = "stroke-dasharray", d = d
                  && d.toLowerCase(), d === "solid") {
                d = S;
              } else {
                if (d) {
                  d = d.replace("shortdashdotdot", "3,1,1,1,1,1,").replace(
                      "shortdashdot", "3,1,1,1").replace("shortdot",
                      "1,1,").replace("shortdash", "3,1,").replace("longdash",
                      "8,3,").replace(/dot/g, "1,3,").replace("dash",
                      "4,3,").replace(/,$/, "").split(",");
                  for (e = d.length; e--;) {
                    d[e] = u(d[e]) * a["stroke-width"];
                  }
                  d = d.join(",")
                }
              }
            } else if (c === "width") {
              d = u(d);
            } else if (c
                === "align") {
              c = "text-anchor", d = {
                left: "start",
                center: "middle",
                right: "end"
              }[d];
            } else if (c === "title") {
              e = g.getElementsByTagName(
                  "title")[0], e || (e = z.createElementNS(sa,
                  "title"), g.appendChild(e)), e.textContent = d;
            }
            c === "strokeWidth" && (c = "stroke-width");
            if (c === "stroke-width" || c === "stroke") {
              this[c] = d;
              if (this.stroke && this["stroke-width"]) {
                A(g,
                    "stroke", this.stroke), A(g, "stroke-width",
                    this["stroke-width"]), this.hasStroke = !0;
              } else if (c
                  === "stroke-width" && d === 0
                  && this.hasStroke) {
                g.removeAttribute(
                    "stroke"), this.hasStroke = !1;
              }
              j = !0
            }
            this.symbolName
            && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)
            && (l || (this.symbolAttr(a), l = !0), j = !0);
            if (m && /^(width|height|visibility|x|y|d|transform)$/.test(
                c)) {
              for (e = m.length; e--;) {
                A(m[e], c,
                    c === "height" ? q(d - (m[e].cutHeight || 0), 0) : d);
              }
            }
            if ((c === "width" || c === "height") && h === "rect" && d < 0) {
              d = 0;
            }
            this[c] = d;
            c === "text" ?
                (d !== this.textStr
                && delete this.bBox, this.textStr = d, this.added
                && i.buildText(
                    this)) : j || A(g, c, d)
          }
        }
        p && this.updateTransform()
      }
      return s
    }, addClass: function (a) {
      A(this.element, "class", A(this.element, "class") + " " + a);
      return this
    }, symbolAttr: function (a) {
      var b = this;
      n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),
          function (c) {
            b[c] = o(a[c], b[c])
          });
      b.attr(
          {d: b.renderer.symbols[b.symbolName](b.x, b.y, b.width, b.height, b)})
    }, clip: function (a) {
      return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" +
          a.id + ")" : S)
    }, crisp: function (a, b, c, d, e) {
      var f, g = {}, h = {}, i,
          a = a || this.strokeWidth || this.attr && this.attr("stroke-width")
              || 0;
      i = t(a) % 2 / 2;
      h.x = T(b || this.x || 0) + i;
      h.y = T(c || this.y || 0) + i;
      h.width = T((d || this.width || 0) - 2 * i);
      h.height = T((e || this.height || 0) - 2 * i);
      h.strokeWidth = a;
      for (f in h) {
        this[f] !== h[f] && (this[f] = g[f] = h[f]);
      }
      return g
    }, css: function (a) {
      var b = this.element,
          c = a && a.width && b.nodeName.toLowerCase() === "text", d, e = "",
          f = function (a, b) {
            return "-" + b.toLowerCase()
          };
      if (a && a.color) {
        a.fill = a.color;
      }
      this.styles = a = v(this.styles,
          a);
      $ && c && delete a.width;
      if (Fa && !Z) {
        c && delete a.width, L(this.element, a);
      } else {
        for (d in a) {
          e += d.replace(/([A-Z])/g, f) + ":" + a[d] + ";";
        }
        A(b, "style", e)
      }
      c && this.added && this.renderer.buildText(this);
      return this
    }, on: function (a, b) {
      if (fb && a === "click") {
        this.element.ontouchstart = function (a) {
          a.preventDefault();
          b()
        };
      }
      this.element["on" + a] = b;
      return this
    }, setRadialReference: function (a) {
      this.element.radialReference = a;
      return this
    }, translate: function (a, b) {
      return this.attr({translateX: a, translateY: b})
    }, invert: function () {
      this.inverted = !0;
      this.updateTransform();
      return this
    }, htmlCss: function (a) {
      var b = this.element;
      if (b = a && b.tagName === "SPAN"
          && a.width) {
        delete a.width, this.textWidth = b, this.updateTransform();
      }
      this.styles = v(this.styles, a);
      L(this.element, a);
      return this
    }, htmlGetBBox: function () {
      var a = this.element, b = this.bBox;
      if (!b) {
        if (a.nodeName === "text") {
          a.style.position = "absolute";
        }
        b = this.bBox = {
          x: a.offsetLeft,
          y: a.offsetTop,
          width: a.offsetWidth,
          height: a.offsetHeight
        }
      }
      return b
    }, htmlUpdateTransform: function () {
      if (this.added) {
        var a = this.renderer,
            b = this.element, c = this.translateX || 0,
            d = this.translateY || 0, e = this.x || 0, f = this.y || 0,
            g = this.textAlign || "left", h = {
              left: 0,
              center: 0.5,
              right: 1
            }[g], i = g && g !== "left", j = this.shadows;
        L(b, {marginLeft: c, marginTop: d});
        j && n(j, function (a) {
          L(a, {marginLeft: c + 1, marginTop: d + 1})
        });
        this.inverted && n(b.childNodes, function (c) {
          a.invertChild(c, b)
        });
        if (b.tagName === "SPAN") {
          var k, m, j = this.rotation, l, p = 0, s = 1, p = 0, xb;
          l = u(this.textWidth);
          var B = this.xCorr || 0, w = this.yCorr || 0,
              G = [j, g, b.innerHTML, this.textWidth].join(",");
          k = {};
          if (G !== this.cTT) {
            if (r(j)) {
              a.isSVG ?
                  (B = Fa ? "-ms-transform" : db ? "-webkit-transform" : eb
                      ? "MozTransform" : Lb ? "-o-transform"
                          : "", k[B] = k.transform = "rotate(" + j + "deg)")
                  : (p = j * bb, s = Y(p), p = ca(p), k.filter = j
                  ? ["progid:DXImageTransform.Microsoft.Matrix(M11=", s,
                    ", M12=", -p, ", M21=", p, ", M22=", s,
                    ", sizingMethod='auto expand')"].join("") : S), L(b, k);
            }
            k = o(this.elemWidth, b.offsetWidth);
            m = o(this.elemHeight, b.offsetHeight);
            if (k > l && /[ \-]/.test(b.textContent || b.innerText)) {
              L(b, {
                width: l + "px",
                display: "block",
                whiteSpace: "normal"
              }), k = l;
            }
            l = a.fontMetrics(b.style.fontSize).b;
            B = s < 0 && -k;
            w = p < 0 && -m;
            xb = s * p < 0;
            B += p * l * (xb ? 1 - h : h);
            w -= s * l * (j ? xb ? h : 1 - h : 1);
            i && (B -= k * h * (s < 0 ? -1 : 1), j && (w -= m * h * (p < 0 ? -1
                : 1)), L(b, {textAlign: g}));
            this.xCorr = B;
            this.yCorr = w
          }
          L(b, {left: e + B + "px", top: f + w + "px"});
          if (db) {
            m = b.offsetHeight;
          }
          this.cTT = G
        }
      } else {
        this.alignOnAdd = !0
      }
    }, updateTransform: function () {
      var a = this.translateX || 0, b = this.translateY || 0, c = this.scaleX,
          d = this.scaleY, e = this.inverted, f = this.rotation;
      e && (a += this.attr("width"), b += this.attr("height"));
      a = ["translate(" + a + "," + b + ")"];
      e ? a.push("rotate(90) scale(-1,1)") :
          f && a.push("rotate(" + f + " " + (this.x || 0) + " " + (this.y || 0)
          + ")");
      (r(c) || r(d)) && a.push("scale(" + o(c, 1) + " " + o(d, 1) + ")");
      a.length && A(this.element, "transform", a.join(" "))
    }, toFront: function () {
      var a = this.element;
      a.parentNode.appendChild(a);
      return this
    }, align: function (a, b, c) {
      var d, e, f, g, h = {};
      e = this.renderer;
      f = e.alignedObjects;
      if (a) {
        if (this.alignOptions = a, this.alignByTranslate = b, !c || fa(
            c)) {
          this.alignTo = d = c || "renderer", ga(f, this), f.push(
              this), c = null
        }
      } else {
        a = this.alignOptions, b = this.alignByTranslate, d = this.alignTo;
      }
      c = o(c, e[d], e);
      d = a.align;
      e = a.verticalAlign;
      f = (c.x || 0) + (a.x || 0);
      g = (c.y || 0) + (a.y || 0);
      if (d === "right" || d === "center") {
        f += (c.width - (a.width || 0))
            / {right: 1, center: 2}[d];
      }
      h[b ? "translateX" : "x"] = t(f);
      if (e === "bottom" || e === "middle") {
        g += (c.height - (a.height || 0))
            / ({bottom: 1, middle: 2}[e] || 1);
      }
      h[b ? "translateY" : "y"] = t(g);
      this[this.placed ? "animate" : "attr"](h);
      this.placed = !0;
      this.alignAttr = h;
      return this
    }, getBBox: function () {
      var a = this.bBox, b = this.renderer, c, d = this.rotation;
      c = this.element;
      var e = this.styles, f = d * bb;
      if (!a) {
        if (c.namespaceURI ===
            sa || b.forExport) {
          try {
            a = c.getBBox ? v({}, c.getBBox()) : {
              width: c.offsetWidth,
              height: c.offsetHeight
            }
          } catch (g) {
          }
          if (!a || a.width < 0) {
            a = {width: 0, height: 0}
          }
        } else {
          a = this.htmlGetBBox();
        }
        if (b.isSVG) {
          b = a.width;
          c = a.height;
          if (Fa && e && e.fontSize === "11px" && c.toPrecision(3)
              === "22.7") {
            a.height = c = 14;
          }
          if (d) {
            a.width = Q(c * ca(f)) + Q(b * Y(f)), a.height = Q(c * Y(f))
                + Q(b * ca(f))
          }
        }
        this.bBox = a
      }
      return a
    }, show: function () {
      return this.attr({visibility: "visible"})
    }, hide: function () {
      return this.attr({visibility: "hidden"})
    }, fadeOut: function (a) {
      var b = this;
      b.animate({opacity: 0}, {
        duration: a || 150, complete: function () {
          b.hide()
        }
      })
    }, add: function (a) {
      var b = this.renderer, c = a || b, d = c.element || b.box,
          e = d.childNodes, f = this.element, g = A(f, "zIndex"), h;
      if (a) {
        this.parentGroup = a;
      }
      this.parentInverted = a && a.inverted;
      this.textStr !== void 0 && b.buildText(this);
      if (g) {
        c.handleZ = !0, g = u(g);
      }
      if (c.handleZ) {
        for (c = 0; c < e.length; c++) {
          if (a = e[c], b = A(a,
              "zIndex"), a !== f && (u(b) > g || !r(g) && r(b))) {
            d.insertBefore(f, a);
            h = !0;
            break
          }
        }
      }
      h || d.appendChild(f);
      this.added = !0;
      D(this, "add");
      return this
    }, safeRemoveChild: function (a) {
      var b =
          a.parentNode;
      b && b.removeChild(a)
    }, destroy: function () {
      var a = this, b = a.element || {}, c = a.shadows, d, e;
      b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = b.point = null;
      Ta(a);
      if (a.clipPath) {
        a.clipPath = a.clipPath.destroy();
      }
      if (a.stops) {
        for (e = 0; e < a.stops.length; e++) {
          a.stops[e] = a.stops[e].destroy();
        }
        a.stops = null
      }
      a.safeRemoveChild(b);
      c && n(c, function (b) {
        a.safeRemoveChild(b)
      });
      a.alignTo && ga(a.renderer.alignedObjects, a);
      for (d in a) {
        delete a[d];
      }
      return null
    }, shadow: function (a, b, c) {
      var d = [], e, f, g = this.element, h, i, j, k;
      if (a) {
        i =
            o(a.width, 3);
        j = (a.opacity || 0.15) / i;
        k = this.parentInverted ? "(-1,-1)" : "(" + o(a.offsetX, 1) + ", " + o(
            a.offsetY, 1) + ")";
        for (e = 1; e <= i; e++) {
          f = g.cloneNode(0);
          h = i * 2 + 1 - 2 * e;
          A(f, {
            isShadow: "true",
            stroke: a.color || "black",
            "stroke-opacity": j * e,
            "stroke-width": h,
            transform: "translate" + k,
            fill: S
          });
          if (c) {
            A(f, "height", q(A(f, "height") - h, 0)), f.cutHeight = h;
          }
          b ? b.element.appendChild(f) : g.parentNode.insertBefore(f, g);
          d.push(f)
        }
        this.shadows = d
      }
      return this
    }
  };
  var Ca = function () {
    this.init.apply(this, arguments)
  };
  Ca.prototype = {
    Element: ra, init: function (a, b, c, d) {
      var e = location, f;
      f = this.createElement("svg").attr({xmlns: sa, version: "1.1"});
      a.appendChild(f.element);
      this.isSVG = !0;
      this.box = f.element;
      this.boxWrapper = f;
      this.alignedObjects = [];
      this.url = (eb || db) && z.getElementsByTagName("base").length
          ? e.href.replace(/#.*?$/, "").replace(/([\('\)])/g, "\\$1").replace(
              / /g, "%20") : "";
      this.createElement("desc").add().element.appendChild(
          z.createTextNode("Created with Highcharts 3.0.2"));
      this.defs = this.createElement("defs").add();
      this.forExport = d;
      this.gradients = {};
      this.setSize(b,
          c, !1);
      var g;
      if (eb && a.getBoundingClientRect) {
        this.subPixelFix = b = function () {
          L(a, {left: 0, top: 0});
          g = a.getBoundingClientRect();
          L(a,
              {left: ja(g.left) - g.left + "px", top: ja(g.top) - g.top + "px"})
        }, b(), J(O, "resize", b)
      }
    }, isHidden: function () {
      return !this.boxWrapper.getBBox().width
    }, destroy: function () {
      var a = this.defs;
      this.box = null;
      this.boxWrapper = this.boxWrapper.destroy();
      Ha(this.gradients || {});
      this.gradients = null;
      if (a) {
        this.defs = a.destroy();
      }
      this.subPixelFix && ba(O, "resize", this.subPixelFix);
      return this.alignedObjects =
          null
    }, createElement: function (a) {
      var b = new this.Element;
      b.init(this, a);
      return b
    }, draw: function () {
    }, buildText: function (a) {
      for (var b = a.element, c = this, d = c.forExport,
          e = o(a.textStr, "").toString().replace(/<(b|strong)>/g,
              '<span style="font-weight:bold">').replace(/<(i|em)>/g,
              '<span style="font-style:italic">').replace(/<a/g,
              "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(
              /<br.*?>/g), f = b.childNodes, g = /style="([^"]+)"/,
          h = /href="([^"]+)"/, i = A(b, "x"), j = a.styles,
          k = j && j.width && u(j.width), m = j && j.lineHeight,
          l = f.length; l--;) {
        b.removeChild(f[l]);
      }
      k && !a.added && this.box.appendChild(b);
      e[e.length - 1] === "" && e.pop();
      n(e, function (e, f) {
        var l, o = 0, e = e.replace(/<span/g, "|||<span").replace(/<\/span>/g,
            "</span>|||");
        l = e.split("|||");
        n(l, function (e) {
          if (e !== "" || l.length === 1) {
            var p = {}, n = z.createElementNS(sa, "tspan"), q;
            g.test(e) && (q = e.match(g)[1].replace(/(;| |^)color([ :])/,
                "$1fill$2"), A(n, "style", q));
            h.test(e) && !d && (A(n, "onclick", 'location.href="' + e.match(
                h)[1] + '"'), L(n, {cursor: "pointer"}));
            e = (e.replace(/<(.|\n)*?>/g,
                "") || " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
            n.appendChild(z.createTextNode(e));
            o ? p.dx = 0 : p.x = i;
            A(n, p);
            !o && f && (!Z && d && L(n, {display: "block"}), A(n, "dy", m
                || c.fontMetrics(/px$/.test(n.style.fontSize) ? n.style.fontSize
                    : j.fontSize).h, db && n.offsetHeight));
            b.appendChild(n);
            o++;
            if (k) {
              for (var e = e.replace(/([^\^])-/g, "$1- ").split(" "), r,
                  t = []; e.length
              || t.length;) {
                delete a.bBox, r = a.getBBox().width, p = r > k, !p
                || e.length === 1 ? (e = t, t = [], e.length
                && (n = z.createElementNS(sa, "tspan"), A(n, {
                  dy: m || 16,
                  x: i
                }), q && A(n, "style",
                    q), b.appendChild(n), r > k && (k = r))) : (n.removeChild(
                    n.firstChild), t.unshift(e.pop())), e.length
                && n.appendChild(
                    z.createTextNode(e.join(" ").replace(/- /g, "-")))
              }
            }
          }
        })
      })
    }, button: function (a, b, c, d, e, f, g) {
      var h = this.label(a, b, c, null, null, null, null, null, "button"),
          i = 0, j, k, m, l, p, a = {
            x1: 0,
            y1: 0,
            x2: 0,
            y2: 1
          }, e = x({
            "stroke-width": 1, stroke: "#CCCCCC", fill: {
              linearGradient: a, stops: [
                [0, "#FEFEFE"],
                [1, "#F6F6F6"]
              ]
            }, r: 2, padding: 5, style: {color: "black"}
          }, e);
      m = e.style;
      delete e.style;
      f = x(e, {
        stroke: "#68A", fill: {
          linearGradient: a, stops: [
            [0,
              "#FFF"],
            [1, "#ACF"]
          ]
        }
      }, f);
      l = f.style;
      delete f.style;
      g = x(e, {
        stroke: "#68A", fill: {
          linearGradient: a, stops: [
            [0, "#9BD"],
            [1, "#CDF"]
          ]
        }
      }, g);
      p = g.style;
      delete g.style;
      J(h.element, "mouseenter", function () {
        h.attr(f).css(l)
      });
      J(h.element, "mouseleave", function () {
        j = [e, f, g][i];
        k = [m, l, p][i];
        h.attr(j).css(k)
      });
      h.setState = function (a) {
        (i = a) ? a === 2 && h.attr(g).css(p) : h.attr(e).css(m)
      };
      return h.on("click", function () {
        d.call(h)
      }).attr(e).css(v({cursor: "default"}, m))
    }, crispLine: function (a, b) {
      a[1] === a[4] && (a[1] = a[4] = t(a[1]) - b % 2 /
          2);
      a[2] === a[5] && (a[2] = a[5] = t(a[2]) + b % 2 / 2);
      return a
    }, path: function (a) {
      var b = {fill: S};
      Da(a) ? b.d = a : V(a) && v(b, a);
      return this.createElement("path").attr(b)
    }, circle: function (a, b, c) {
      a = V(a) ? a : {x: a, y: b, r: c};
      return this.createElement("circle").attr(a)
    }, arc: function (a, b, c, d, e, f) {
      if (V(a)) {
        b = a.y, c = a.r, d = a.innerR, e = a.start, f = a.end, a = a.x;
      }
      return this.symbol("arc", a || 0, b || 0, c || 0, c || 0,
          {innerR: d || 0, start: e || 0, end: f || 0})
    }, rect: function (a, b, c, d, e, f) {
      e = V(a) ? a.r : e;
      e = this.createElement("rect").attr({rx: e, ry: e, fill: S});
      return e.attr(V(a) ?
          a : e.crisp(f, a, b, q(c, 0), q(d, 0)))
    }, setSize: function (a, b, c) {
      var d = this.alignedObjects, e = d.length;
      this.width = a;
      this.height = b;
      for (this.boxWrapper[o(c, !0) ? "animate" : "attr"](
          {width: a, height: b}); e--;) {
        d[e].align()
      }
    }, g: function (a) {
      var b = this.createElement("g");
      return r(a) ? b.attr({"class": "highcharts-" + a}) : b
    }, image: function (a, b, c, d, e) {
      var f = {preserveAspectRatio: S};
      arguments.length > 1 && v(f, {x: b, y: c, width: d, height: e});
      f = this.createElement("image").attr(f);
      f.element.setAttributeNS ? f.element.setAttributeNS(
          "http://www.w3.org/1999/xlink",
          "href", a) : f.element.setAttribute("hc-svg-href", a);
      return f
    }, symbol: function (a, b, c, d, e, f) {
      var g, h = this.symbols[a], h = h && h(t(b), t(c), d, e, f),
          i = /^url\((.*?)\)$/, j, k;
      if (h) {
        g = this.path(h), v(g, {
          symbolName: a,
          x: b,
          y: c,
          width: d,
          height: e
        }), f && v(g, f);
      } else if (i.test(a)) {
        k = function (a, b) {
          a.element && (a.attr({width: b[0], height: b[1]}), a.alignByTranslate
          || a.translate(t((d - b[0]) / 2), t((e - b[1]) / 2)))
        }, j = a.match(i)[1], a = Nb[j], g = this.image(j).attr(
            {x: b, y: c}), g.isImg = !0, a ? k(g, a) : (g.attr({
          width: 0,
          height: 0
        }), U("img", {
          onload: function () {
            k(g,
                Nb[j] = [this.width, this.height])
          }, src: j
        }));
      }
      return g
    }, symbols: {
      circle: function (a, b, c, d) {
        var e = 0.166 * c;
        return ["M", a + c / 2, b, "C", a + c + e, b, a + c + e, b + d,
          a + c / 2, b + d, "C", a - e, b + d, a - e, b, a + c / 2, b, "Z"]
      }, square: function (a, b, c, d) {
        return ["M", a, b, "L", a + c, b, a + c, b + d, a, b + d, "Z"]
      }, triangle: function (a, b, c, d) {
        return ["M", a + c / 2, b, "L", a + c, b + d, a, b + d, "Z"]
      }, "triangle-down": function (a, b, c, d) {
        return ["M", a, b, "L", a + c, b, a + c / 2, b + d, "Z"]
      }, diamond: function (a, b, c, d) {
        return ["M", a + c / 2, b, "L", a + c, b + d / 2, a + c / 2, b + d, a,
          b + d / 2, "Z"]
      }, arc: function (a, b, c, d, e) {
        var f = e.start, c = e.r || c || d, g = e.end - 0.001, d = e.innerR,
            h = e.open, i = Y(f), j = ca(f), k = Y(g), g = ca(g),
            e = e.end - f < Ka ? 0 : 1;
        return ["M", a + c * i, b + c * j, "A", c, c, 0, e, 1, a + c * k,
          b + c * g, h ? "M" : "L", a + d * k, b + d * g, "A", d, d, 0, e, 0,
          a + d * i, b + d * j, h ? "" : "Z"]
      }
    }, clipRect: function (a, b, c, d) {
      var e = "highcharts-" + ub++,
          f = this.createElement("clipPath").attr({id: e}).add(this.defs),
          a = this.rect(a, b, c, d, 0).add(f);
      a.id = e;
      a.clipPath = f;
      return a
    }, color: function (a, b, c) {
      var d = this, e, f = /^rgba/, g, h, i, j, k, m, l, p = [];
      a && a.linearGradient ? g = "linearGradient" : a && a.radialGradient &&
          (g = "radialGradient");
      if (g) {
        c = a[g];
        h = d.gradients;
        j = a.stops;
        b = b.radialReference;
        Da(c) && (a[g] = c = {
          x1: c[0],
          y1: c[1],
          x2: c[2],
          y2: c[3],
          gradientUnits: "userSpaceOnUse"
        });
        g === "radialGradient" && b && !r(c.gradientUnits) && (c = x(c, {
          cx: b[0] - b[2] / 2 + c.cx * b[2],
          cy: b[1] - b[2] / 2 + c.cy * b[2],
          r: c.r * b[2],
          gradientUnits: "userSpaceOnUse"
        }));
        for (l in c) {
          l !== "id" && p.push(l, c[l]);
        }
        for (l in j) {
          p.push(j[l]);
        }
        p = p.join(",");
        h[p] ? a = h[p].id : (c.id = a = "highcharts-"
            + ub++, h[p] = i = d.createElement(g).attr(c).add(
            d.defs), i.stops = [], n(j, function (a) {
          f.test(a[1]) ?
              (e = ma(a[1]), k = e.get("rgb"), m = e.get("a"))
              : (k = a[1], m = 1);
          a = d.createElement("stop").attr(
              {offset: a[0], "stop-color": k, "stop-opacity": m}).add(i);
          i.stops.push(a)
        }));
        return "url(" + d.url + "#" + a + ")"
      } else {
        return f.test(a) ? (e = ma(a), A(b, c + "-opacity",
            e.get("a")), e.get("rgb")) : (b.removeAttribute(c + "-opacity"), a)
      }
    }, text: function (a, b, c, d) {
      var e = N.chart.style, f = $ || !Z && this.forExport;
      if (d && !this.forExport) {
        return this.html(a, b, c);
      }
      b = t(o(b, 0));
      c = t(o(c, 0));
      a = this.createElement("text").attr({x: b, y: c, text: a}).css({
        fontFamily: e.fontFamily,
        fontSize: e.fontSize
      });
      f && a.css({position: "absolute"});
      a.x = b;
      a.y = c;
      return a
    }, html: function (a, b, c) {
      var d = N.chart.style, e = this.createElement("span"), f = e.attrSetters,
          g = e.element, h = e.renderer;
      f.text = function (a) {
        a !== g.innerHTML && delete this.bBox;
        g.innerHTML = a;
        return !1
      };
      f.x = f.y = f.align = function (a, b) {
        b === "align" && (b = "textAlign");
        e[b] = a;
        e.htmlUpdateTransform();
        return !1
      };
      e.attr({text: a, x: t(b), y: t(c)}).css({
        position: "absolute",
        whiteSpace: "nowrap",
        fontFamily: d.fontFamily,
        fontSize: d.fontSize
      });
      e.css = e.htmlCss;
      if (h.isSVG) {
        e.add = function (a) {
          var b, c = h.box.parentNode, d = [];
          if (a) {
            if (b = a.div, !b) {
              for (; a;) {
                d.push(a), a = a.parentGroup;
              }
              n(d.reverse(), function (a) {
                var d;
                b = a.div = a.div || U(ya, {className: A(a.element, "class")}, {
                  position: "absolute",
                  left: (a.translateX || 0) + "px",
                  top: (a.translateY || 0) + "px"
                }, b || c);
                d = b.style;
                v(a.attrSetters, {
                  translateX: function (a) {
                    d.left = a + "px"
                  }, translateY: function (a) {
                    d.top = a + "px"
                  }, visibility: function (a, b) {
                    d[b] = a
                  }
                })
              })
            }
          } else {
            b = c;
          }
          b.appendChild(g);
          e.added = !0;
          e.alignOnAdd && e.htmlUpdateTransform();
          return e
        };
      }
      return e
    }, fontMetrics: function (a) {
      var a = u(a || 11), a = a < 24 ? a + 4 : t(a * 1.2), b = t(a * 0.8);
      return {h: a, b: b}
    }, label: function (a, b, c, d, e, f, g, h, i) {
      function j() {
        var a, b;
        a = o.element.style;
        w = (Ma === void 0 || yb === void 0 || s.styles.textAlign)
            && o.getBBox();
        s.width = (Ma || w.width || 0) + 2 * q + hb;
        s.height = (yb || w.height || 0) + 2 * q;
        A = q + p.fontMetrics(a && a.fontSize).b;
        if (z) {
          if (!B) {
            a = t(-G * q), b = h ? -A : 0, s.box = B = d ? p.symbol(d, a,
                b, s.width, s.height) : p.rect(a, b, s.width, s.height, 0,
                u[Pb]), B.add(s);
          }
          B.isImg || B.attr(x({width: s.width, height: s.height}, u));
          u = null
        }
      }

      function k() {
        var a = s.styles, a = a && a.textAlign, b = hb + q * (1 - G), c;
        c = h ? 0 : A;
        if (r(Ma) && (a === "center" || a === "right")) {
          b += {
            center: 0.5,
            right: 1
          }[a] * (Ma - w.width);
        }
        (b !== o.x || c !== o.y) && o.attr({x: b, y: c});
        o.x = b;
        o.y = c
      }

      function m(a, b) {
        B ? B.attr(a, b) : u[a] = b
      }

      function l() {
        o.add(s);
        s.attr({text: a, x: b, y: c});
        B && r(e) && s.attr({anchorX: e, anchorY: f})
      }

      var p = this, s = p.g(i), o = p.text("", 0, 0, g).attr({zIndex: 1}), B, w,
          G = 0, q = 3, hb = 0, Ma, yb, P, H, C = 0, u = {}, A,
          g = s.attrSetters, z;
      J(s, "add", l);
      g.width = function (a) {
        Ma = a;
        return !1
      };
      g.height = function (a) {
        yb =
            a;
        return !1
      };
      g.padding = function (a) {
        r(a) && a !== q && (q = a, k());
        return !1
      };
      g.paddingLeft = function (a) {
        r(a) && a !== hb && (hb = a, k());
        return !1
      };
      g.align = function (a) {
        G = {left: 0, center: 0.5, right: 1}[a];
        return !1
      };
      g.text = function (a, b) {
        o.attr(b, a);
        j();
        k();
        return !1
      };
      g[Pb] = function (a, b) {
        z = !0;
        C = a % 2 / 2;
        m(b, a);
        return !1
      };
      g.stroke = g.fill = g.r = function (a, b) {
        b === "fill" && (z = !0);
        m(b, a);
        return !1
      };
      g.anchorX = function (a, b) {
        e = a;
        m(b, a + C - P);
        return !1
      };
      g.anchorY = function (a, b) {
        f = a;
        m(b, a - H);
        return !1
      };
      g.x = function (a) {
        s.x = a;
        a -= G * ((Ma || w.width) + q);
        P = t(a);
        s.attr("translateX", P);
        return !1
      };
      g.y = function (a) {
        H = s.y = t(a);
        s.attr("translateY", H);
        return !1
      };
      var E = s.css;
      return v(s, {
        css: function (a) {
          if (a) {
            var b = {}, a = x(a);
            n("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration".split(
                ","), function (c) {
              a[c] !== y && (b[c] = a[c], delete a[c])
            });
            o.css(b)
          }
          return E.call(s, a)
        }, getBBox: function () {
          return {
            width: w.width + 2 * q,
            height: w.height + 2 * q,
            x: w.x - q,
            y: w.y - q
          }
        }, shadow: function (a) {
          B && B.shadow(a);
          return s
        }, destroy: function () {
          ba(s, "add", l);
          ba(s.element, "mouseenter");
          ba(s.element, "mouseleave");
          o && (o = o.destroy());
          B && (B = B.destroy());
          ra.prototype.destroy.call(s);
          s = p = j = k = m = l = null
        }
      })
    }
  };
  Sa = Ca;
  var F;
  if (!Z && !$) {
    Highcharts.VMLElement = F = {
      init: function (a, b) {
        var c = ["<", b, ' filled="f" stroked="f"'],
            d = ["position: ", "absolute", ";"], e = b === ya;
        (b === "shape" || e) && d.push("left:0;top:0;width:1px;height:1px;");
        d.push("visibility: ", e ? "hidden" : "visible");
        c.push(' style="', d.join(""), '"/>');
        if (b) {
          c = e || b === "span" || b === "img" ? c.join("") : a.prepVML(
              c), this.element = U(c);
        }
        this.renderer = a;
        this.attrSetters =
            {}
      },
      add: function (a) {
        var b = this.renderer, c = this.element, d = b.box,
            d = a ? a.element || a : d;
        a && a.inverted && b.invertChild(c, d);
        d.appendChild(c);
        this.added = !0;
        this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
        D(this, "add");
        return this
      },
      updateTransform: ra.prototype.htmlUpdateTransform,
      attr: function (a, b) {
        var c, d, e, f = this.element || {}, g = f.style, h = f.nodeName,
            i = this.renderer, j = this.symbolName, k, m = this.shadows, l,
            p = this.attrSetters, s = this;
        fa(a) && r(b) && (c = a, a = {}, a[c] = b);
        if (fa(a)) {
          c = a, s = c === "strokeWidth" ||
          c === "stroke-width" ? this.strokeweight : this[c];
        } else {
          for (c in
              a) {
            if (d = a[c], l = !1, e = p[c] && p[c].call(this, d, c), e !== !1
            && d !== null) {
              e !== y && (d = e);
              if (j
                  && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(
                      c)) {
                k || (this.symbolAttr(a), k = !0), l = !0;
              } else if (c
                  === "d") {
                d = d || [];
                this.d = d.join(" ");
                e = d.length;
                l = [];
                for (var o; e--;) {
                  if (Ea(d[e])) {
                    l[e] = t(d[e] * 10)
                        - 5;
                  } else if (d[e]
                      === "Z") {
                    l[e] = "x";
                  } else if (l[e] = d[e], d.isArc && (d[e]
                      === "wa" || d[e] === "at")) {
                    o = d[e] === "wa" ? 1 : -1, l[e
                    + 5] === l[e + 7] && (l[e + 7] -= o), l[e + 6] === l[e + 8]
                    && (l[e + 8] -=
                        o);
                  }
                }
                d = l.join(" ") || "x";
                f.path = d;
                if (m) {
                  for (e = m.length; e--;) {
                    m[e].path = m[e].cutOff
                        ? this.cutOffPath(d, m[e].cutOff) : d;
                  }
                }
                l = !0
              } else if (c === "visibility") {
                if (m) {
                  for (e = m.length; e--;) {
                    m[e].style[c] = d;
                  }
                }
                h === "DIV" && (d = d === "hidden" ? "-999em" : 0, cb
                || (g[c] = d
                    ? "visible" : "hidden"), c = "top");
                g[c] = d;
                l = !0
              } else if (c === "zIndex") {
                d && (g[c] = d), l = !0;
              } else if (la(c,
                  ["x", "y", "width", "height"]) !== -1) {
                this[c] = d, c === "x"
                || c === "y" ? c = {
                  x: "left",
                  y: "top"
                }[c] : d = q(0, d), this.updateClipping
                    ? (this[c] = d, this.updateClipping())
                    : g[c] = d, l = !0;
              } else if (c === "class" &&
                  h === "DIV") {
                f.className = d;
              } else if (c
                  === "stroke") {
                d = i.color(d, f,
                    c), c = "strokecolor";
              } else if (c === "stroke-width" || c
                  === "strokeWidth") {
                f.stroked = d ? !0
                    : !1, c = "strokeweight", this[c] = d, Ea(d)
                && (d += "px");
              } else if (c === "dashstyle") {
                (f.getElementsByTagName(
                    "stroke")[0] || U(i.prepVML(["<stroke/>"]), null, null,
                    f))[c] = d || "solid", this.dashstyle = d, l = !0;
              } else if (c
                  === "fill") {
                if (h === "SPAN") {
                  g.color = d;
                } else {
                  if (h !== "IMG") {
                    f.filled = d !== S ? !0 : !1, d = i.color(d, f,
                        c, this), c = "fillcolor"
                  }
                }
              } else if (c === "opacity") {
                l = !0;
              } else if (h === "shape" && c
                  === "rotation") {
                this[c] =
                    d, f.style.left = -t(ca(d * bb) + 1)
                    + "px", f.style.top = t(
                    Y(d * bb)) + "px";
              } else if (c === "translateX" || c
                  === "translateY" || c
                  === "rotation") {
                this[c] = d, this.updateTransform(), l = !0;
              } else if (c
                  === "text") {
                this.bBox = null, f.innerHTML = d, l = !0;
              }
              l || (cb ? f[c] = d : A(f, c, d))
            }
          }
        }
        return s
      },
      clip: function (a) {
        var b = this, c;
        a ? (c = a.members, ga(c, b), c.push(b), b.destroyClip = function () {
          ga(c, b)
        }, a = a.getCSS(b)) : (b.destroyClip && b.destroyClip(), a = {
          clip: cb ? "inherit" : "rect(auto)"
        });
        return b.css(a)
      },
      css: ra.prototype.htmlCss,
      safeRemoveChild: function (a) {
        a.parentNode &&
        Ra(a)
      },
      destroy: function () {
        this.destroyClip && this.destroyClip();
        return ra.prototype.destroy.apply(this)
      },
      on: function (a, b) {
        this.element["on" + a] = function () {
          var a = O.event;
          a.target = a.srcElement;
          b(a)
        };
        return this
      },
      cutOffPath: function (a, b) {
        var c, a = a.split(/[ ,]/);
        c = a.length;
        if (c === 9 || c === 11) {
          a[c - 4] = a[c - 2] = u(a[c - 2]) - 10 * b;
        }
        return a.join(" ")
      },
      shadow: function (a, b, c) {
        var d = [], e, f = this.element, g = this.renderer, h, i = f.style, j,
            k = f.path, m, l, p, s;
        k && typeof k.value !== "string" && (k = "x");
        l = k;
        if (a) {
          p = o(a.width, 3);
          s = (a.opacity ||
              0.15) / p;
          for (e = 1; e <= 3; e++) {
            m = p * 2 + 1 - 2 * e;
            c && (l = this.cutOffPath(k.value, m + 0.5));
            j = ['<shape isShadow="true" strokeweight="', m,
              '" filled="false" path="', l, '" coordsize="10 10" style="',
              f.style.cssText, '" />'];
            h = U(g.prepVML(j), null, {
              left: u(i.left) + o(a.offsetX, 1),
              top: u(i.top) + o(a.offsetY, 1)
            });
            if (c) {
              h.cutOff = m + 1;
            }
            j = ['<stroke color="', a.color || "black", '" opacity="', s * e,
              '"/>'];
            U(g.prepVML(j), null, null, h);
            b ? b.element.appendChild(h) : f.parentNode.insertBefore(h, f);
            d.push(h)
          }
          this.shadows = d
        }
        return this
      }
    };
    F = ea(ra, F);
    var na = {
      Element: F, isIE8: Aa.indexOf("MSIE 8.0") > -1, init: function (a, b, c) {
        var d, e;
        this.alignedObjects = [];
        d = this.createElement(ya);
        e = d.element;
        e.style.position = "relative";
        a.appendChild(d.element);
        this.isVML = !0;
        this.box = e;
        this.boxWrapper = d;
        this.setSize(b, c, !1);
        if (!z.namespaces.hcv) {
          z.namespaces.add("hcv",
              "urn:schemas-microsoft-com:vml"), z.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
        }
      }, isHidden: function () {
        return !this.box.offsetWidth
      },
      clipRect: function (a, b, c, d) {
        var e = this.createElement(), f = V(a);
        return v(e, {
          members: [],
          left: f ? a.x : a,
          top: f ? a.y : b,
          width: f ? a.width : c,
          height: f ? a.height : d,
          getCSS: function (a) {
            var b = a.element, c = b.nodeName, a = a.inverted,
                d = this.top - (c === "shape" ? b.offsetTop : 0), e = this.left,
                b = e + this.width, f = d + this.height, d = {
                  clip: "rect(" + t(a ? e : d) + "px," + t(a ? f : b) + "px," + t(
                      a ? b : f) + "px," + t(a ? d : e) + "px)"
                };
            !a && cb && c === "DIV" && v(d,
                {width: b + "px", height: f + "px"});
            return d
          },
          updateClipping: function () {
            n(e.members, function (a) {
              a.css(e.getCSS(a))
            })
          }
        })
      },
      color: function (a, b, c, d) {
        var e = this, f, g = /^rgba/, h, i, j = S;
        a && a.linearGradient ? i = "gradient" : a && a.radialGradient
            && (i = "pattern");
        if (i) {
          var k, m, l = a.linearGradient || a.radialGradient, p, s, o, B, w,
              q = "", a = a.stops, r, t = [], y = function () {
                h = ['<fill colors="' + t.join(",") + '" opacity="', o,
                  '" o:opacity2="', s, '" type="', i, '" ', q,
                  'focus="100%" method="any" />'];
                U(e.prepVML(h), null, null, b)
              };
          p = a[0];
          r = a[a.length - 1];
          p[0] > 0 && a.unshift([0, p[1]]);
          r[0] < 1 && a.push([1, r[1]]);
          n(a, function (a, b) {
            g.test(a[1]) ? (f = ma(a[1]), k = f.get("rgb"),
                m = f.get("a")) : (k = a[1], m = 1);
            t.push(a[0] * 100 + "% " + k);
            b ? (o = m, B = k) : (s = m, w = k)
          });
          if (c === "fill") {
            if (i === "gradient") {
              c = l.x1 || l[0]
                  || 0, a = l.y1 || l[1] || 0, p = l.x2 || l[2] || 0, l = l.y2
                  || l[3] || 0, q = 'angle="' + (90 - I.atan((l - a) / (p - c))
                  * 180 / Ka) + '"', y();
            } else {
              var j = l.r, v = j * 2, P = j * 2, H = l.cx, C = l.cy,
                  x = b.radialReference, u, j = function () {
                    x && (u = d.getBBox(), H += (x[0] - u.x) / u.width
                        - 0.5, C += (x[1] - u.y) / u.height - 0.5, v *= x[2]
                        / u.width, P *= x[2] / u.height);
                    q = 'src="' + N.global.VMLRadialGradientURL + '" size="' + v
                        + ","
                        + P + '" origin="0.5,0.5" position="' + H + "," +
                        C + '" color2="' + w + '" ';
                    y()
                  };
              d.added ? j() : J(d, "add", j);
              j = B
            }
          } else {
            j = k
          }
        } else if (g.test(a) && b.tagName !== "IMG") {
          f = ma(a), h = ["<", c,
            ' opacity="', f.get("a"), '"/>'], U(this.prepVML(h), null, null,
              b), j = f.get("rgb");
        } else {
          j = b.getElementsByTagName(c);
          if (j.length) {
            j[0].opacity = 1, j[0].type = "solid";
          }
          j = a
        }
        return j
      }, prepVML: function (a) {
        var b = this.isIE8, a = a.join("");
        b ? (a = a.replace("/>",
            ' xmlns="urn:schemas-microsoft-com:vml" />'), a = a.indexOf(
            'style="') === -1 ? a.replace("/>",
            ' style="display:inline-block;behavior:url(#default#VML);" />') :
            a.replace('style="',
                'style="display:inline-block;behavior:url(#default#VML);'))
            : a = a.replace("<", "<hcv:");
        return a
      }, text: Ca.prototype.html, path: function (a) {
        var b = {coordsize: "10 10"};
        Da(a) ? b.d = a : V(a) && v(b, a);
        return this.createElement("shape").attr(b)
      }, circle: function (a, b, c) {
        var d = this.symbol("circle");
        if (V(a)) {
          c = a.r, b = a.y, a = a.x;
        }
        d.isCircle = !0;
        return d.attr({x: a, y: b, width: 2 * c, height: 2 * c})
      }, g: function (a) {
        var b;
        a && (b = {className: "highcharts-" + a, "class": "highcharts-" + a});
        return this.createElement(ya).attr(b)
      },
      image: function (a, b, c, d, e) {
        var f = this.createElement("img").attr({src: a});
        arguments.length > 1 && f.attr({x: b, y: c, width: d, height: e});
        return f
      }, rect: function (a, b, c, d, e, f) {
        if (V(
            a)) {
          b = a.y, c = a.width, d = a.height, f = a.strokeWidth, a = a.x;
        }
        var g = this.symbol("rect");
        g.r = e;
        return g.attr(g.crisp(f, a, b, q(c, 0), q(d, 0)))
      }, invertChild: function (a, b) {
        var c = b.style;
        L(a, {
          flip: "x",
          left: u(c.width) - 1,
          top: u(c.height) - 1,
          rotation: -90
        })
      }, symbols: {
        arc: function (a, b, c, d, e) {
          var f = e.start, g = e.end, h = e.r || c || d, c = e.innerR, d = Y(f),
              i = ca(f), j = Y(g),
              k = ca(g);
          if (g - f === 0) {
            return ["x"];
          }
          f = ["wa", a - h, b - h, a + h, b + h, a + h * d, b + h * i,
            a + h * j, b + h * k];
          e.open && !c && f.push("e", "M", a, b);
          f.push("at", a - c, b - c, a + c, b + c, a + c * j, b + c * k, a + c
              * d, b + c * i, "x", "e");
          f.isArc = !0;
          return f
        }, circle: function (a, b, c, d, e) {
          e && e.isCircle && (a -= c / 2, b -= d / 2);
          return ["wa", a, b, a + c, b + d, a + c, b + d / 2, a + c, b + d / 2,
            "e"]
        }, rect: function (a, b, c, d, e) {
          var f = a + c, g = b + d, h;
          !r(e) || !e.r ? f = Ca.prototype.symbols.square.apply(0, arguments)
              : (h = K(e.r, c, d), f = ["M", a + h, b, "L", f - h, b, "wa",
                f - 2 * h, b, f, b + 2 * h, f - h, b, f, b + h, "L", f, g - h, "wa",
                f - 2 * h, g - 2 *
                h, f, g, f, g - h, f - h, g, "L", a + h, g, "wa", a, g - 2 * h,
                a + 2 * h, g, a + h, g, a, g - h, "L", a, b + h, "wa", a, b,
                a + 2 * h, b + 2 * h, a, b + h, a + h, b, "x", "e"]);
          return f
        }
      }
    };
    Highcharts.VMLRenderer = F = function () {
      this.init.apply(this, arguments)
    };
    F.prototype = x(Ca.prototype, na);
    Sa = F
  }
  var Rb;
  if ($) {
    Highcharts.CanVGRenderer = F = function () {
      sa = "http://www.w3.org/1999/xhtml"
    }, F.prototype.symbols = {}, Rb = function () {
      function a() {
        var a = b.length, d;
        for (d = 0; d < a; d++) {
          b[d]();
        }
        b = []
      }

      var b = [];
      return {
        push: function (c, d) {
          b.length === 0 && Tb(d, a);
          b.push(c)
        }
      }
    }(), Sa = F;
  }
  Ja.prototype =
      {
        addLabel: function () {
          var a = this.axis, b = a.options, c = a.chart, d = a.horiz,
              e = a.categories, f = a.series[0] && a.series[0].names,
              g = this.pos, h = b.labels, i = a.tickPositions,
              d = d && e && !h.step && !h.staggerLines && !h.rotation
                  && c.plotWidth / i.length || !d && (c.optionsMarginLeft
                      || c.plotWidth / 2), j = g === i[0],
              k = g === i[i.length - 1], f = e ? o(e[g], f && f[g], g) : g,
              e = this.label, i = i.info, m;
          a.isDatetimeAxis && i && (m = b.dateTimeLabelFormats[i.higherRanks[g]
          || i.unitName]);
          this.isFirst = j;
          this.isLast = k;
          b = a.labelFormatter.call({
            axis: a, chart: c, isFirst: j,
            isLast: k, dateTimeLabelFormat: m, value: a.isLog ? ia(da(f)) : f
          });
          g = d && {width: q(1, t(d - 2 * (h.padding || 10))) + "px"};
          g = v(g, h.style);
          if (r(e)) {
            e && e.attr({text: b}).css(g);
          } else {
            d = {align: h.align};
            if (Ea(h.rotation)) {
              d.rotation = h.rotation;
            }
            this.label = r(b) && h.enabled ? c.renderer.text(b, 0, 0,
                h.useHTML).attr(d).css(g).add(a.labelGroup) : null
          }
        }, getLabelSize: function () {
          var a = this.label, b = this.axis;
          return a ? (this.labelBBox = a.getBBox())[b.horiz ? "height"
              : "width"] : 0
        }, getLabelSides: function () {
          var a = this.axis.options.labels, b = this.labelBBox.width,
              a = b * {left: 0, center: 0.5, right: 1}[a.align] - a.x;
          return [-a, b - a]
        }, handleOverflow: function (a, b) {
          var c = !0, d = this.axis, e = d.chart, f = this.isFirst,
              g = this.isLast, h = b.x, i = d.reversed, j = d.tickPositions;
          if (f || g) {
            var k = this.getLabelSides(), m = k[0], k = k[1], e = e.plotLeft,
                l = e + d.len,
                j = (d = d.ticks[j[a + (f ? 1 : -1)]]) && d.label.xy
                    && d.label.xy.x + d.getLabelSides()[f ? 0 : 1];
            f && !i || g && i ? h + m < e && (h = e - m, d && h + k > j
            && (c = !1)) : h + k > l && (h = l - k, d && h + m < j && (c = !1));
            b.x = h
          }
          return c
        }, getPosition: function (a, b, c, d) {
          var e = this.axis, f = e.chart, g = d && f.oldChartHeight ||
              f.chartHeight;
          return {
            x: a ? e.translate(b + c, null, null, d) + e.transB : e.left
                + e.offset + (e.opposite ? (d && f.oldChartWidth
                    || f.chartWidth) - e.right - e.left : 0),
            y: a ? g - e.bottom + e.offset - (e.opposite ? e.height : 0) : g
                - e.translate(b + c, null, null, d) - e.transB
          }
        }, getLabelPosition: function (a, b, c, d, e, f, g, h) {
          var i = this.axis, j = i.transA, k = i.reversed, i = i.staggerLines,
              a = a + e.x - (f && d ? f * j * (k ? -1 : 1) : 0),
              b = b + e.y - (f && !d ? f * j * (k ? 1 : -1) : 0);
          r(e.y) || (b += u(c.styles.lineHeight) * 0.9 - c.getBBox().height
              / 2);
          i && (b += g / (h || 1) % i * 16);
          return {x: a, y: b}
        }, getMarkPath: function (a, b, c, d, e, f) {
          return f.crispLine(
              ["M", a, b, "L", a + (e ? 0 : -c), b + (e ? c : 0)], d)
        }, render: function (a, b, c) {
          var d = this.axis, e = d.options, f = d.chart.renderer, g = d.horiz,
              h = this.type, i = this.label, j = this.pos, k = e.labels,
              m = this.gridLine, l = h ? h + "Grid" : "grid",
              p = h ? h + "Tick" : "tick", s = e[l + "LineWidth"],
              n = e[l + "LineColor"], B = e[l + "LineDashStyle"],
              w = e[p + "Length"], l = e[p + "Width"] || 0, q = e[p + "Color"],
              r = e[p + "Position"], p = this.mark, t = k.step, v = !0,
              u = d.tickmarkOffset, P = this.getPosition(g, j, u, b), H = P.x,
              P = P.y, C = g && H === d.pos || !g && P === d.pos + d.len ?
              -1 : 1, x = d.staggerLines;
          this.isActive = !0;
          if (s) {
            j = d.getPlotLinePath(j + u, s * C, b, !0);
            if (m === y) {
              m = {stroke: n, "stroke-width": s};
              if (B) {
                m.dashstyle = B;
              }
              if (!h) {
                m.zIndex = 1;
              }
              if (b) {
                m.opacity = 0;
              }
              this.gridLine = m = s ? f.path(j).attr(m).add(d.gridGroup) : null
            }
            if (!b && m && j) {
              m[this.isNew ? "attr" : "animate"](
                  {d: j, opacity: c})
            }
          }
          if (l && w) {
            r === "inside" && (w = -w), d.opposite
            && (w = -w), b = this.getMarkPath(H, P, w, l * C, g, f), p
                ? p.animate({
                  d: b,
                  opacity: c
                }) : this.mark = f.path(b).attr(
                    {stroke: q, "stroke-width": l, opacity: c}).add(
                    d.axisGroup);
          }
          if (i && !isNaN(H)) {
            i.xy =
                P = this.getLabelPosition(H, P, i, g, k, u, a, t), this.isFirst
            && !o(e.showFirstLabel, 1) || this.isLast && !o(e.showLastLabel, 1)
                ? v = !1 : !x && g && k.overflow === "justify"
                && !this.handleOverflow(a, P) && (v = !1), t && a % t
            && (v = !1), v && !isNaN(P.y) ? (P.opacity = c, i[this.isNew
                ? "attr"
                : "animate"](P), this.isNew = !1) : i.attr("y", -9999)
          }
        }, destroy: function () {
          Ha(this, this.axis)
        }
      };
  pb.prototype = {
    render: function () {
      var a = this, b = a.axis, c = b.horiz, d = (b.pointRange || 0) / 2,
          e = a.options, f = e.label, g = a.label, h = e.width, i = e.to,
          j = e.from, k = r(j) && r(i), m = e.value, l =
              e.dashStyle, p = a.svgElem, s = [], n, B = e.color, w = e.zIndex,
          G = e.events, t = b.chart.renderer;
      b.isLog && (j = ka(j), i = ka(i), m = ka(m));
      if (h) {
        if (s = b.getPlotLinePath(m, h), d = {
          stroke: B,
          "stroke-width": h
        }, l) {
          d.dashstyle = l
        }
      } else if (k) {
        if (j = q(j, b.min - d), i = K(i, b.max + d), s = b.getPlotBandPath(j,
            i,
            e), d = {fill: B}, e.borderWidth) {
          d.stroke = e.borderColor, d["stroke-width"] = e.borderWidth
        }
      } else {
        return;
      }
      if (r(w)) {
        d.zIndex = w;
      }
      if (p) {
        s ? p.animate({d: s}, null, p.onGetPath)
            : (p.hide(), p.onGetPath = function () {
              p.show()
            });
      } else if (s && s.length && (a.svgElem = p = t.path(s).attr(
          d).add(),
          G)) {
        for (n in e = function (b) {
          p.on(b, function (c) {
            G[b].apply(a, [c])
          })
        }, G) {
          e(n);
        }
      }
      if (f && r(f.text) && s && s.length && b.width > 0 && b.height > 0) {
        f = x({
          align: c && k && "center",
          x: c ? !k && 4 : 10,
          verticalAlign: !c && k && "middle",
          y: c ? k ? 16 : 10 : k ? 6 : -4,
          rotation: c && !k && 90
        }, f);
        if (!g) {
          a.label = g = t.text(f.text, 0, 0).attr({
            align: f.textAlign || f.align,
            rotation: f.rotation,
            zIndex: w
          }).css(f.style).add();
        }
        b = [s[1], s[4], o(s[6], s[1])];
        s = [s[2], s[5], o(s[7], s[2])];
        c = Ga(b);
        k = Ga(s);
        g.align(f, !1, {x: c, y: k, width: pa(b) - c, height: pa(s) - k});
        g.show()
      } else {
        g && g.hide();
      }
      return a
    }, destroy: function () {
      ga(this.axis.plotLinesAndBands, this);
      Ha(this, this.axis)
    }
  };
  Kb.prototype = {
    destroy: function () {
      Ha(this, this.axis)
    }, setTotal: function (a) {
      this.cum = this.total = a
    }, render: function (a) {
      var b = this.options, c = b.format,
          c = c ? wa(c, this) : b.formatter.call(this);
      this.label ? this.label.attr({
        text: c,
        visibility: "hidden"
      }) : this.label = this.axis.chart.renderer.text(c, 0, 0, b.useHTML).css(
          b.style).attr({
        align: this.textAlign,
        rotation: b.rotation,
        visibility: "hidden"
      }).add(a)
    }, setOffset: function (a, b) {
      var c =
              this.axis, d = c.chart, e = d.inverted, f = this.isNegative,
          g = c.translate(this.percent ? 100 : this.total, 0, 0, 0, 1),
          c = c.translate(0), c = Q(g - c),
          h = d.xAxis[0].translate(this.x) + a, i = d.plotHeight, f = {
            x: e ? f ? g : g - c : h,
            y: e ? i - h - b : f ? i - g - c : i - g,
            width: e ? c : b,
            height: e ? b : c
          };
      if (e = this.label) {
        e.align(this.alignOptions, null,
            f), f = e.alignAttr, e.attr({
          visibility: this.options.crop === !1 || d.isInsidePlot(f.x, f.y) ? Z
              ? "inherit" : "visible" : "hidden"
        })
      }
    }
  };
  ab.prototype = {
    defaultOptions: {
      dateTimeLabelFormats: {
        millisecond: "%H:%M:%S.%L",
        second: "%H:%M:%S",
        minute: "%H:%M",
        hour: "%H:%M",
        day: "%e. %b",
        week: "%e. %b",
        month: "%b '%y",
        year: "%Y"
      },
      endOnTick: !1,
      gridLineColor: "#C0C0C0",
      labels: M,
      lineColor: "#C0D0E0",
      lineWidth: 1,
      minPadding: 0.01,
      maxPadding: 0.01,
      minorGridLineColor: "#E0E0E0",
      minorGridLineWidth: 1,
      minorTickColor: "#A0A0A0",
      minorTickLength: 2,
      minorTickPosition: "outside",
      startOfWeek: 1,
      startOnTick: !1,
      tickColor: "#C0D0E0",
      tickLength: 5,
      tickmarkPlacement: "between",
      tickPixelInterval: 100,
      tickPosition: "outside",
      tickWidth: 1,
      title: {
        align: "middle", style: {
          color: "#4d759e",
          fontWeight: "bold"
        }
      },
      type: "linear"
    },
    defaultYAxisOptions: {
      endOnTick: !0,
      gridLineWidth: 1,
      tickPixelInterval: 72,
      showLastLabel: !0,
      labels: {align: "right", x: -8, y: 3},
      lineWidth: 0,
      maxPadding: 0.05,
      minPadding: 0.05,
      startOnTick: !0,
      tickWidth: 0,
      title: {rotation: 270, text: "Values"},
      stackLabels: {
        enabled: !1, formatter: function () {
          return ua(this.total, -1)
        }, style: M.style
      }
    },
    defaultLeftAxisOptions: {
      labels: {align: "right", x: -8, y: null},
      title: {rotation: 270}
    },
    defaultRightAxisOptions: {
      labels: {align: "left", x: 8, y: null},
      title: {rotation: 90}
    },
    defaultBottomAxisOptions: {
      labels: {align: "center", x: 0, y: 14},
      title: {rotation: 0}
    },
    defaultTopAxisOptions: {
      labels: {align: "center", x: 0, y: -5},
      title: {rotation: 0}
    },
    init: function (a, b) {
      var c = b.isX;
      this.horiz = a.inverted ? !c : c;
      this.xOrY = (this.isXAxis = c) ? "x" : "y";
      this.opposite = b.opposite;
      this.side = this.horiz ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3;
      this.setOptions(b);
      var d = this.options, e = d.type;
      this.labelFormatter = d.labels.formatter || this.defaultLabelFormatter;
      this.staggerLines = this.horiz && d.labels.staggerLines;
      this.userOptions =
          b;
      this.minPixelPadding = 0;
      this.chart = a;
      this.reversed = d.reversed;
      this.zoomEnabled = d.zoomEnabled !== !1;
      this.categories = d.categories || e === "category";
      this.isLog = e === "logarithmic";
      this.isDatetimeAxis = e === "datetime";
      this.isLinked = r(d.linkedTo);
      this.tickmarkOffset = this.categories && d.tickmarkPlacement === "between"
          ? 0.5 : 0;
      this.ticks = {};
      this.minorTicks = {};
      this.plotLinesAndBands = [];
      this.alternateBands = {};
      this.len = 0;
      this.minRange = this.userMinRange = d.minRange || d.maxZoom;
      this.range = d.range;
      this.offset = d.offset || 0;
      this.stacks = {};
      this._stacksTouched = 0;
      this.min = this.max = null;
      var f, d = this.options.events;
      la(this, a.axes) === -1 && (a.axes.push(this), a[c ? "xAxis"
          : "yAxis"].push(this));
      this.series = this.series || [];
      if (a.inverted && c && this.reversed === y) {
        this.reversed = !0;
      }
      this.removePlotLine = this.removePlotBand = this.removePlotBandOrLine;
      for (f in d) {
        J(this, f, d[f]);
      }
      if (this.isLog) {
        this.val2lin = ka, this.lin2val = da
      }
    },
    setOptions: function (a) {
      this.options = x(this.defaultOptions,
          this.isXAxis ? {} : this.defaultYAxisOptions,
          [this.defaultTopAxisOptions,
            this.defaultRightAxisOptions, this.defaultBottomAxisOptions,
            this.defaultLeftAxisOptions][this.side],
          x(N[this.isXAxis ? "xAxis" : "yAxis"], a))
    },
    update: function (a, b) {
      var c = this.chart,
          a = c.options[this.xOrY + "Axis"][this.options.index] = x(
              this.userOptions, a);
      this.destroy();
      this._addedPlotLB = !1;
      this.init(c, a);
      c.isDirtyBox = !0;
      o(b, !0) && c.redraw()
    },
    remove: function (a) {
      var b = this.chart, c = this.xOrY + "Axis";
      n(this.series, function (a) {
        a.remove(!1)
      });
      ga(b.axes, this);
      ga(b[c], this);
      b.options[c].splice(this.options.index,
          1);
      n(b[c], function (a, b) {
        a.options.index = b
      });
      this.destroy();
      b.isDirtyBox = !0;
      o(a, !0) && b.redraw()
    },
    defaultLabelFormatter: function () {
      var a = this.axis, b = this.value, c = a.categories,
          d = this.dateTimeLabelFormat, e = N.lang.numericSymbols,
          f = e && e.length, g, h = a.options.labels.format,
          a = a.isLog ? b : a.tickInterval;
      if (h) {
        g = wa(h, this);
      } else if (c) {
        g = b;
      } else if (d) {
        g = Ua(d,
            b);
      } else if (f && a >= 1E3) {
        for (; f-- && g === y;) {
          c = Math.pow(
              1E3, f + 1), a >= c && e[f] !== null && (g = ua(b / c, -1)
              + e[f]);
        }
      }
      g === y && (g = b >= 1E3 ? ua(b, 0) : ua(b, -1));
      return g
    },
    getSeriesExtremes: function () {
      var a =
              this, b = a.chart, c = a.stacks, d = [], e = [],
          f = a._stacksTouched += 1, g, h;
      a.hasVisibleSeries = !1;
      a.dataMin = a.dataMax = null;
      n(a.series, function (g) {
        if (g.visible || !b.options.chart.ignoreHiddenSeries) {
          var j = g.options, k, m, l, p, s, n, B, w, G, t = j.threshold, v,
              u = [], x = 0;
          a.hasVisibleSeries = !0;
          if (a.isLog && t <= 0) {
            t = j.threshold = null;
          }
          if (a.isXAxis) {
            if (j = g.xData, j.length) {
              a.dataMin = K(o(a.dataMin, j[0]),
                  Ga(j)), a.dataMax = q(o(a.dataMax, j[0]), pa(j))
            }
          } else {
            var P, H, C, A = g.cropped, z = g.xAxis.getExtremes(),
                E = !!g.modifyValue;
            k = j.stacking;
            a.usePercentage =
                k === "percent";
            if (k) {
              s = j.stack, p = g.type + o(s, ""), n = "-"
                  + p, g.stackKey = p, m = d[p] || [], d[p] = m, l = e[n]
                  || [], e[n] = l;
            }
            if (a.usePercentage) {
              a.dataMin = 0, a.dataMax = 99;
            }
            j = g.processedXData;
            B = g.processedYData;
            v = B.length;
            for (h = 0; h < v; h++) {
              w = j[h];
              G = B[h];
              if (k) {
                H = (P = G < t) ? l : m, C = P ? n : p, r(H[w])
                    ? (H[w] = ia(H[w] + G), G = [G, H[w]]) : H[w] = G, c[C]
                || (c[C] = {}), c[C][w] || (c[C][w] = new Kb(a,
                    a.options.stackLabels, P, w, s, k)), c[C][w].setTotal(
                    H[w]), c[C][w].touched = f;
              }
              if (G !== null && G !== y && (!a.isLog || G.length || G
                  > 0)) {
                if (E && (G = g.modifyValue(G)), g.getExtremesFromAll ||
                A || (j[h + 1] || w) >= z.min && (j[h - 1] || w)
                <= z.max) {
                  if (w = G.length) {
                    for (; w--;) {
                      G[w] !== null
                      && (u[x++] = G[w]);
                    }
                  } else {
                    u[x++] = G
                  }
                }
              }
            }
            if (!a.usePercentage && u.length) {
              g.dataMin = k = Ga(
                  u), g.dataMax = g = pa(u), a.dataMin = K(o(a.dataMin, k),
                  k), a.dataMax = q(o(a.dataMax, g), g);
            }
            if (r(t)) {
              if (a.dataMin
                  >= t) {
                a.dataMin = t, a.ignoreMinPadding = !0;
              } else if (a.dataMax
                  < t) {
                a.dataMax = t, a.ignoreMaxPadding = !0
              }
            }
          }
        }
      });
      for (g in c) {
        for (h in c[g]) {
          c[g][h].touched < f
          && (c[g][h].destroy(), delete c[g][h])
        }
      }
    },
    translate: function (a, b, c, d, e, f) {
      var g = this.len, h = 1, i = 0, j = d ? this.oldTransA :
          this.transA, d = d ? this.oldMin : this.min, k = this.minPixelPadding,
          e = (this.options.ordinal || this.isLog && e) && this.lin2val;
      if (!j) {
        j = this.transA;
      }
      c && (h *= -1, i = g);
      this.reversed && (h *= -1, i -= h * g);
      b ? (a = a * h + i, a -= k, a = a / j + d, e && (a = this.lin2val(a)))
          : (e && (a = this.val2lin(a)), a = h * (a - d) * j + i + h * k + (f
          ? j * this.pointRange / 2 : 0));
      return a
    },
    toPixels: function (a, b) {
      return this.translate(a, !1, !this.horiz, null, !0) + (b ? 0 : this.pos)
    },
    toValue: function (a, b) {
      return this.translate(a - (b ? 0 : this.pos), !0, !this.horiz, null, !0)
    },
    getPlotLinePath: function (a, b, c, d) {
      var e = this.chart, f = this.left, g = this.top, h, i, j,
          a = this.translate(a, null, null, c),
          k = c && e.oldChartHeight || e.chartHeight,
          m = c && e.oldChartWidth || e.chartWidth, l;
      h = this.transB;
      c = i = t(a + h);
      h = j = t(k - a - h);
      if (isNaN(a)) {
        l = !0;
      } else if (this.horiz) {
        if (h = g, j = k - this.bottom, c < f || c > f + this.width) {
          l = !0
        }
      } else if (c = f, i = m - this.right, h < g || h > g
      + this.height) {
        l = !0;
      }
      return l && !d ? null : e.renderer.crispLine(["M", c, h, "L", i, j], b
          || 0)
    },
    getPlotBandPath: function (a, b) {
      var c = this.getPlotLinePath(b), d = this.getPlotLinePath(a);
      d && c ? d.push(c[4],
          c[5], c[1], c[2]) : d = null;
      return d
    },
    getLinearTickPositions: function (a, b, c) {
      for (var d, b = ia(T(b / a) * a), c = ia(ja(c / a) * a), e = [];
          b <= c;) {
        e.push(b);
        b = ia(b + a);
        if (b === d) {
          break;
        }
        d = b
      }
      return e
    },
    getLogTickPositions: function (a, b, c, d) {
      var e = this.options, f = this.len, g = [];
      if (!d) {
        this._minorAutoInterval = null;
      }
      if (a >= 0.5) {
        a = t(a), g = this.getLinearTickPositions(a, b,
            c);
      } else if (a >= 0.08) {
        for (var f = T(b), h, i, j, k, m,
            e = a > 0.3 ? [1, 2, 4] : a > 0.15 ? [1, 2, 4, 6, 8] : [1, 2, 3, 4,
              5,
              6, 7, 8, 9]; f < c + 1 && !m; f++) {
          i = e.length;
          for (h = 0; h < i && !m; h++) {
            j = ka(da(f) * e[h]), j > b && (!d ||
                k <= c) && g.push(k), k > c && (m = !0), k = j
          }
        }
      } else if (b = da(b), c = da(c), a = e[d ? "minorTickInterval"
          : "tickInterval"], a = o(a === "auto" ? null : a,
          this._minorAutoInterval, (c - b) * (e.tickPixelInterval / (d ? 5 : 1))
          / ((d ? f / this.tickPositions.length : f) || 1)), a = ib(a, null,
          I.pow(10, T(I.log(a) / I.LN10))), g = La(
          this.getLinearTickPositions(a, b, c),
          ka), !d) {
        this._minorAutoInterval = a / 5;
      }
      if (!d) {
        this.tickInterval = a;
      }
      return g
    },
    getMinorTickPositions: function () {
      var a = this.options, b = this.tickPositions, c = this.minorTickInterval,
          d = [], e;
      if (this.isLog) {
        e = b.length;
        for (a = 1; a < e; a++) {
          d = d.concat(
              this.getLogTickPositions(c, b[a - 1], b[a], !0))
        }
      } else if (this.isDatetimeAxis && a.minorTickInterval
          === "auto") {
        d = d.concat(
            Cb(Ab(c), this.min, this.max, a.startOfWeek)), d[0] < this.min
        && d.shift();
      } else {
        for (b = this.min + (b[0] - this.min) % c;
            b <= this.max; b += c) {
          d.push(b);
        }
      }
      return d
    },
    adjustForMinRange: function () {
      var a = this.options, b = this.min, c = this.max, d,
          e = this.dataMax - this.dataMin >= this.minRange, f, g, h, i, j;
      if (this.isXAxis && this.minRange === y && !this.isLog) {
        r(a.min) || r(
            a.max) ? this.minRange = null : (n(this.series,
            function (a) {
              i = a.xData;
              for (g = j = a.xIncrement ? 1 : i.length - 1; g > 0;
                  g--) {
                if (h = i[g] - i[g - 1], f === y || h < f) {
                  f = h
                }
              }
            }), this.minRange = K(f * 5, this.dataMax - this.dataMin));
      }
      if (c - b < this.minRange) {
        var k = this.minRange;
        d = (k - c + b) / 2;
        d = [b - d, o(a.min, b - d)];
        if (e) {
          d[2] = this.dataMin;
        }
        b = pa(d);
        c = [b + k, o(a.max, b + k)];
        if (e) {
          c[2] = this.dataMax;
        }
        c = Ga(c);
        c - b < k && (d[0] = c - k, d[1] = o(a.min, c - k), b = pa(d))
      }
      this.min = b;
      this.max = c
    },
    setAxisTranslation: function (a) {
      var b = this.max - this.min, c = 0, d, e = 0, f = 0,
          g = this.linkedParent, h = this.transA;
      if (this.isXAxis) {
        g ? (e = g.minPointOffset,
            f = g.pointRangePadding) : n(this.series, function (a) {
          var g = a.pointRange, h = a.options.pointPlacement,
              m = a.closestPointRange;
          g > b && (g = 0);
          c = q(c, g);
          e = q(e, h ? 0 : g / 2);
          f = q(f, h === "on" ? 0 : g);
          !a.noSharedTooltip && r(m) && (d = r(d) ? K(d, m) : m)
        }), g = this.ordinalSlope && d ? this.ordinalSlope / d
            : 1, this.minPointOffset = e *= g, this.pointRangePadding = f *= g, this.pointRange = K(
            c, b), this.closestPointRange = d;
      }
      if (a) {
        this.oldTransA = h;
      }
      this.translationSlope = this.transA = h = this.len / (b + f || 1);
      this.transB = this.horiz ? this.left : this.bottom;
      this.minPixelPadding =
          h * e
    },
    setTickPositions: function (a) {
      var b = this, c = b.chart, d = b.options, e = b.isLog,
          f = b.isDatetimeAxis, g = b.isXAxis, h = b.isLinked,
          i = b.options.tickPositioner, j = d.maxPadding, k = d.minPadding,
          m = d.tickInterval, l = d.minTickInterval, p = d.tickPixelInterval,
          s = b.categories;
      h ? (b.linkedParent = c[g ? "xAxis"
          : "yAxis"][d.linkedTo], c = b.linkedParent.getExtremes(), b.min = o(
          c.min, c.dataMin), b.max = o(c.max, c.dataMax), d.type
      !== b.linkedParent.options.type && qa(11, 1)) : (b.min = o(b.userMin,
          d.min, b.dataMin), b.max = o(b.userMax, d.max, b.dataMax));
      if (e) {
        !a && K(b.min, o(b.dataMin, b.min)) <= 0 && qa(10, 1), b.min = ia(
            ka(b.min)), b.max = ia(ka(b.max));
      }
      if (b.range && (b.userMin = b.min = q(b.min, b.max
          - b.range), b.userMax = b.max, a)) {
        b.range = null;
      }
      b.beforePadding && b.beforePadding();
      b.adjustForMinRange();
      if (!s && !b.usePercentage && !h && r(b.min) && r(b.max) && (c = b.max
          - b.min)) {
        if (!r(d.min) && !r(b.userMin) && k && (b.dataMin < 0
            || !b.ignoreMinPadding)) {
          b.min -= c * k;
        }
        if (!r(d.max) && !r(b.userMax) && j && (b.dataMax > 0
            || !b.ignoreMaxPadding)) {
          b.max += c * j
        }
      }
      b.tickInterval = b.min === b.max || b.min === void 0 || b.max === void 0
          ? 1 : h && !m && p === b.linkedParent.options.tickPixelInterval
              ? b.linkedParent.tickInterval : o(m,
                  s ? 1 : (b.max - b.min) * p / (b.len || 1));
      g && !a && n(b.series, function (a) {
        a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
      });
      b.setAxisTranslation(!0);
      b.beforeSetTickPositions && b.beforeSetTickPositions();
      if (b.postProcessTickInterval) {
        b.tickInterval = b.postProcessTickInterval(
            b.tickInterval);
      }
      if (!m && b.tickInterval < l) {
        b.tickInterval = l;
      }
      if (!f && !e && (a = I.pow(10,
          T(I.log(b.tickInterval) / I.LN10)), !m)) {
        b.tickInterval = ib(
            b.tickInterval,
            null, a, d);
      }
      b.minorTickInterval = d.minorTickInterval === "auto" && b.tickInterval
          ? b.tickInterval / 5 : d.minorTickInterval;
      b.tickPositions = i = d.tickPositions ? [].concat(d.tickPositions) : i
          && i.apply(b, [b.min, b.max]);
      if (!i) {
        i = f ? (b.getNonLinearTimeTicks || Cb)(
            Ab(b.tickInterval, d.units), b.min, b.max, d.startOfWeek,
            b.ordinalPositions, b.closestPointRange, !0) : e
            ? b.getLogTickPositions(b.tickInterval, b.min, b.max)
            : b.getLinearTickPositions(b.tickInterval, b.min,
                b.max), b.tickPositions = i;
      }
      if (!h) {
        e = i[0], f = i[i.length - 1], h = b.minPointOffset ||
            0, d.startOnTick ? b.min = e : b.min - h > e
            && i.shift(), d.endOnTick
            ? b.max = f : b.max + h < f && i.pop(), i.length === 1
        && (b.min -= 0.001, b.max += 0.001)
      }
    },
    setMaxTicks: function () {
      var a = this.chart, b = a.maxTicks || {}, c = this.tickPositions,
          d = this._maxTicksKey = [this.xOrY, this.pos, this.len].join("-");
      if (!this.isLinked && !this.isDatetimeAxis && c && c.length > (b[d] || 0)
          && this.options.alignTicks !== !1) {
        b[d] = c.length;
      }
      a.maxTicks = b
    },
    adjustTickAmount: function () {
      var a = this._maxTicksKey, b = this.tickPositions,
          c = this.chart.maxTicks;
      if (c && c[a] && !this.isDatetimeAxis && !this.categories
          && !this.isLinked && this.options.alignTicks !== !1) {
        var d = this.tickAmount, e = b.length;
        this.tickAmount = a = c[a];
        if (e < a) {
          for (; b.length < a;) {
            b.push(ia(b[b.length - 1] + this.tickInterval));
          }
          this.transA *= (e - 1) / (a - 1);
          this.max = b[b.length - 1]
        }
        if (r(d) && a !== d) {
          this.isDirty = !0
        }
      }
    },
    setScale: function () {
      var a = this.stacks, b, c, d, e;
      this.oldMin = this.min;
      this.oldMax = this.max;
      this.oldAxisLength = this.len;
      this.setAxisSize();
      e = this.len !== this.oldAxisLength;
      n(this.series, function (a) {
        if (a.isDirtyData || a.isDirty || a.xAxis.isDirty) {
          d = !0
        }
      });
      if (e || d || this.isLinked || this.forceRedraw || this.userMin
          !== this.oldUserMin || this.userMax
          !== this.oldUserMax) {
        if (this.forceRedraw = !1, this.getSeriesExtremes(), this.setTickPositions(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, !this.isDirty) {
          this.isDirty = e
              || this.min !== this.oldMin || this.max !== this.oldMax;
        }
      }
      if (!this.isXAxis) {
        for (b in a) {
          for (c in
              a[b]) {
            a[b][c].cum = a[b][c].total;
          }
        }
      }
      this.setMaxTicks()
    },
    setExtremes: function (a, b, c, d, e) {
      var f = this, g = f.chart, c = o(c, !0), e = v(e, {min: a, max: b});
      D(f, "setExtremes",
          e, function () {
            f.userMin = a;
            f.userMax = b;
            f.isDirtyExtremes = !0;
            c && g.redraw(d)
          })
    },
    zoom: function (a, b) {
      this.allowZoomOutside || (a <= this.dataMin && (a = y), b >= this.dataMax
      && (b = y));
      this.displayBtn = a !== y || b !== y;
      this.setExtremes(a, b, !1, y, {trigger: "zoom"});
      return !0
    },
    setAxisSize: function () {
      var a = this.chart, b = this.options, c = b.offsetLeft || 0,
          d = b.offsetRight || 0, e = this.horiz, f, g;
      this.left = g = o(b.left, a.plotLeft + c);
      this.top = f = o(b.top, a.plotTop);
      this.width = c = o(b.width, a.plotWidth - c + d);
      this.height = b = o(b.height, a.plotHeight);
      this.bottom = a.chartHeight - b - f;
      this.right = a.chartWidth - c - g;
      this.len = q(e ? c : b, 0);
      this.pos = e ? g : f
    },
    getExtremes: function () {
      var a = this.isLog;
      return {
        min: a ? ia(da(this.min)) : this.min,
        max: a ? ia(da(this.max)) : this.max,
        dataMin: this.dataMin,
        dataMax: this.dataMax,
        userMin: this.userMin,
        userMax: this.userMax
      }
    },
    getThreshold: function (a) {
      var b = this.isLog, c = b ? da(this.min) : this.min,
          b = b ? da(this.max) : this.max;
      c > a || a === null ? a = c : b < a && (a = b);
      return this.translate(a, 0, 1, 0, 1)
    },
    addPlotBand: function (a) {
      this.addPlotBandOrLine(a, "plotBands")
    },
    addPlotLine: function (a) {
      this.addPlotBandOrLine(a, "plotLines")
    },
    addPlotBandOrLine: function (a, b) {
      var c = (new pb(this, a)).render(), d = this.userOptions;
      b && (d[b] = d[b] || [], d[b].push(a));
      this.plotLinesAndBands.push(c);
      return c
    },
    getOffset: function () {
      var a = this, b = a.chart, c = b.renderer, d = a.options,
          e = a.tickPositions, f = a.ticks, g = a.horiz, h = a.side,
          i = b.inverted ? [1, 0, 3, 2][h] : h, j, k = 0, m, l = 0, p = d.title,
          s = d.labels, t = 0, B = b.axisOffset, w = b.clipOffset,
          G = [-1, 1, 1, -1][h], v;
      a.hasData = b = a.hasVisibleSeries || r(a.min) && r(a.max) && !!e;
      a.showAxis = j = b || o(d.showEmpty, !0);
      if (!a.axisGroup) {
        a.gridGroup = c.g("grid").attr(
            {zIndex: d.gridZIndex || 1}).add(), a.axisGroup = c.g("axis").attr(
            {zIndex: d.zIndex || 2}).add(), a.labelGroup = c.g(
            "axis-labels").attr({zIndex: s.zIndex || 7}).add();
      }
      if (b || a.isLinked) {
        n(e, function (b) {
          f[b] ? f[b].addLabel() : f[b] = new Ja(a, b)
        }), n(e, function (a) {
          if (h === 0 || h === 2 || {1: "left", 3: "right"}[h] === s.align) {
            t = q(
                f[a].getLabelSize(), t)
          }
        }), a.staggerLines && (t += (a.staggerLines - 1) * 16);
      } else {
        for (v in
            f) {
          f[v].destroy(), delete f[v];
        }
      }
      if (p && p.text &&
          p.enabled !== !1) {
        if (!a.axisTitle) {
          a.axisTitle = c.text(p.text, 0, 0, p.useHTML).attr({
            zIndex: 7,
            rotation: p.rotation || 0,
            align: p.textAlign || {
              low: "left",
              middle: "center",
              high: "right"
            }[p.align]
          }).css(p.style).add(a.axisGroup), a.axisTitle.isNew = !0;
        }
        if (j) {
          k = a.axisTitle.getBBox()[g ? "height" : "width"], l = o(
              p.margin, g ? 5 : 10), m = p.offset;
        }
        a.axisTitle[j ? "show" : "hide"]()
      }
      a.offset = G * o(d.offset, B[h]);
      a.axisTitleMargin = o(m, t + l + (h !== 2 && t && G * d.labels[g ? "y"
          : "x"]));
      B[h] = q(B[h], a.axisTitleMargin + k + G * a.offset);
      w[i] = q(w[i], d.lineWidth)
    },
    getLinePath: function (a) {
      var b = this.chart, c = this.opposite, d = this.offset, e = this.horiz,
          f = this.left + (c ? this.width : 0) + d;
      this.lineTop = d = b.chartHeight - this.bottom - (c ? this.height : 0)
          + d;
      c || (a *= -1);
      return b.renderer.crispLine(
          ["M", e ? this.left : f, e ? d : this.top, "L",
            e ? b.chartWidth - this.right : f,
            e ? d : b.chartHeight - this.bottom], a)
    },
    getTitlePosition: function () {
      var a = this.horiz, b = this.left, c = this.top, d = this.len,
          e = this.options.title, f = a ? b : c, g = this.opposite,
          h = this.offset, i = u(e.style.fontSize || 12), d = {
            low: f + (a ? 0 : d), middle: f +
            d / 2, high: f + (a ? d : 0)
          }[e.align], b = (a ? c + this.height : b) + (a ? 1 : -1) * (g ? -1 : 1)
          * this.axisTitleMargin + (this.side === 2 ? i : 0);
      return {
        x: a ? d : b + (g ? this.width : 0) + h + (e.x || 0),
        y: a ? b - (g ? this.height : 0) + h : d + (e.y || 0)
      }
    },
    render: function () {
      var a = this, b = a.chart, c = b.renderer, d = a.options, e = a.isLog,
          f = a.isLinked, g = a.tickPositions, h = a.axisTitle, i = a.stacks,
          j = a.ticks, k = a.minorTicks, m = a.alternateBands,
          l = d.stackLabels, p = d.alternateGridColor, s = a.tickmarkOffset,
          o = d.lineWidth, B,
          w = b.hasRendered && r(a.oldMin) && !isNaN(a.oldMin);
      B = a.hasData;
      var q =
          a.showAxis, t, v;
      n([j, k, m], function (a) {
        for (var b in a) {
          a[b].isActive = !1
        }
      });
      if (B || f) {
        if (a.minorTickInterval && !a.categories && n(
            a.getMinorTickPositions(), function (b) {
              k[b] || (k[b] = new Ja(a, b, "minor"));
              w && k[b].isNew && k[b].render(null, !0);
              k[b].render(null, !1, 1)
            }), g.length && (n(g.slice(1).concat([g[0]]), function (b, c) {
          c = c === g.length - 1 ? 0 : c + 1;
          if (!f || b >= a.min && b <= a.max) {
            j[b] || (j[b] = new Ja(a, b)), w
            && j[b].isNew && j[b].render(c, !0), j[b].render(c, !1, 1)
          }
        }), s && a.min === 0 && (j[-1] || (j[-1] = new Ja(a, -1, null,
            !0)), j[-1].render(-1))),
        p && n(g, function (b, c) {
          if (c % 2 === 0 && b < a.max) {
            m[b] || (m[b] = new pb(a)), t = b
                + s, v = g[c + 1] !== y ? g[c + 1] + s : a.max, m[b].options = {
              from: e ? da(t) : t,
              to: e ? da(v) : v,
              color: p
            }, m[b].render(), m[b].isActive = !0
          }
        }), !a._addedPlotLB) {
          n((d.plotLines || []).concat(d.plotBands || []),
              function (b) {
                a.addPlotBandOrLine(b)
              }), a._addedPlotLB = !0;
        }
      }
      n([j, k, m], function (a) {
        var c, d, e = [], f = za ? za.duration || 500 : 0, g = function () {
          for (d = e.length; d--;) {
            a[e[d]] && !a[e[d]].isActive
            && (a[e[d]].destroy(), delete a[e[d]])
          }
        };
        for (c in a) {
          if (!a[c].isActive) {
            a[c].render(c, !1, 0),
                a[c].isActive = !1, e.push(c);
          }
        }
        a === m || !b.hasRendered || !f ? g() : f && setTimeout(g, f)
      });
      if (o) {
        B = a.getLinePath(o), a.axisLine ? a.axisLine.animate({d: B})
            : a.axisLine = c.path(B).attr({
              stroke: d.lineColor,
              "stroke-width": o,
              zIndex: 7
            }).add(a.axisGroup), a.axisLine[q ? "show" : "hide"]();
      }
      if (h && q) {
        h[h.isNew ? "attr" : "animate"](
            a.getTitlePosition()), h.isNew = !1;
      }
      if (l && l.enabled) {
        var u, x, d = a.stackTotalGroup;
        if (!d) {
          a.stackTotalGroup = d = c.g("stack-labels").attr(
              {visibility: "visible", zIndex: 6}).add();
        }
        d.translate(b.plotLeft, b.plotTop);
        for (u in i) {
          for (x in c =
              i[u], c) {
            c[x].render(d)
          }
        }
      }
      a.isDirty = !1
    },
    removePlotBandOrLine: function (a) {
      for (var b = this.plotLinesAndBands, c = b.length; c--;) {
        b[c].id === a
        && b[c].destroy()
      }
    },
    setTitle: function (a, b) {
      this.update({title: a}, b)
    },
    redraw: function () {
      var a = this.chart.pointer;
      a.reset && a.reset(!0);
      this.render();
      n(this.plotLinesAndBands, function (a) {
        a.render()
      });
      n(this.series, function (a) {
        a.isDirty = !0
      })
    },
    setCategories: function (a, b) {
      this.update({categories: a}, b)
    },
    destroy: function () {
      var a = this, b = a.stacks, c;
      ba(a);
      for (c in b) {
        Ha(b[c]), b[c] = null;
      }
      n([a.ticks, a.minorTicks, a.alternateBands, a.plotLinesAndBands],
          function (a) {
            Ha(a)
          });
      n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(
          ","), function (b) {
        a[b] && (a[b] = a[b].destroy())
      })
    }
  };
  qb.prototype = {
    init: function (a, b) {
      var c = b.borderWidth, d = b.style, e = u(d.padding);
      this.chart = a;
      this.options = b;
      this.crosshairs = [];
      this.now = {x: 0, y: 0};
      this.isHidden = !0;
      this.label = a.renderer.label("", 0, 0, b.shape, null, null, b.useHTML,
          null, "tooltip").attr({
        padding: e, fill: b.backgroundColor, "stroke-width": c,
        r: b.borderRadius, zIndex: 8
      }).css(d).css({padding: 0}).hide().add();
      $ || this.label.shadow(b.shadow);
      this.shared = b.shared
    }, destroy: function () {
      n(this.crosshairs, function (a) {
        a && a.destroy()
      });
      if (this.label) {
        this.label = this.label.destroy();
      }
      clearTimeout(this.hideTimer);
      clearTimeout(this.tooltipTimeout)
    }, move: function (a, b, c, d) {
      var e = this, f = e.now, g = e.options.animation !== !1 && !e.isHidden;
      v(f, {
        x: g ? (2 * f.x + a) / 3 : a,
        y: g ? (f.y + b) / 2 : b,
        anchorX: g ? (2 * f.anchorX + c) / 3 : c,
        anchorY: g ? (f.anchorY + d) / 2 : d
      });
      e.label.attr(f);
      if (g && (Q(a -
          f.x) > 1 || Q(b - f.y) > 1)) {
        clearTimeout(
            this.tooltipTimeout), this.tooltipTimeout = setTimeout(function () {
          e && e.move(a, b, c, d)
        }, 32)
      }
    }, hide: function () {
      var a = this, b;
      clearTimeout(this.hideTimer);
      if (!this.isHidden) {
        b = this.chart.hoverPoints, this.hideTimer = setTimeout(
            function () {
              a.label.fadeOut();
              a.isHidden = !0
            }, o(this.options.hideDelay, 500)), b && n(b, function (a) {
          a.setState()
        }), this.chart.hoverPoints = null
      }
    }, hideCrosshairs: function () {
      n(this.crosshairs, function (a) {
        a && a.hide()
      })
    }, getAnchor: function (a, b) {
      var c, d = this.chart, e =
          d.inverted, f = d.plotTop, g = 0, h = 0, i, a = ha(a);
      c = a[0].tooltipPos;
      this.followPointer && b && (b.chartX === y && (b = d.pointer.normalize(
          b)), c = [b.chartX - d.plotLeft, b.chartY - f]);
      c || (n(a, function (a) {
        i = a.series.yAxis;
        g += a.plotX;
        h += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!e && i
            ? i.top - f : 0)
      }), g /= a.length, h /= a.length, c = [e ? d.plotWidth - h : g,
        this.shared && !e && a.length > 1 && b ? b.chartY - f : e ? d.plotHeight
            - g : h]);
      return La(c, t)
    }, getPosition: function (a, b, c) {
      var d = this.chart, e = d.plotLeft, f = d.plotTop, g = d.plotWidth,
          h = d.plotHeight, i =
              o(this.options.distance, 12), j = c.plotX, c = c.plotY,
          d = j + e + (d.inverted ? i : -a - i), k = c - b + f + 15, m;
      d < 7 && (d = e + q(j, 0) + i);
      d + a > e + g && (d -= d + a - (e + g), k = c - b + f - i, m = !0);
      k < f + 5 && (k = f + 5, m && c >= k && c <= k + b && (k = c + f + i));
      k + b > f + h && (k = q(f, f + h - b - i));
      return {x: d, y: k}
    }, defaultFormatter: function (a) {
      var b = this.points || ha(this), c = b[0].series, d;
      d = [c.tooltipHeaderFormatter(b[0])];
      n(b, function (a) {
        c = a.series;
        d.push(c.tooltipFormatter && c.tooltipFormatter(a)
            || a.point.tooltipFormatter(c.tooltipOptions.pointFormat))
      });
      d.push(a.options.footerFormat ||
          "");
      return d.join("")
    }, refresh: function (a, b) {
      var c = this.chart, d = this.label, e = this.options, f, g, h, i = {}, j,
          k = [];
      j = e.formatter || this.defaultFormatter;
      var i = c.hoverPoints, m, l = e.crosshairs;
      h = this.shared;
      clearTimeout(this.hideTimer);
      this.followPointer = ha(a)[0].series.tooltipOptions.followPointer;
      g = this.getAnchor(a, b);
      f = g[0];
      g = g[1];
      h && (!a.series || !a.series.noSharedTooltip) ? (c.hoverPoints = a, i
      && n(i, function (a) {
        a.setState()
      }), n(a, function (a) {
        a.setState("hover");
        k.push(a.getLabelConfig())
      }), i = {
        x: a[0].category,
        y: a[0].y
      }, i.points = k, a = a[0]) : i = a.getLabelConfig();
      j = j.call(i, this);
      i = a.series;
      h = h || !i.isCartesian || i.tooltipOutsidePlot || c.isInsidePlot(f, g);
      j === !1 || !h ? this.hide() : (this.isHidden && (Ta(d), d.attr("opacity",
          1).show()), d.attr({text: j}), m = e.borderColor || a.color || i.color
          || "#606060", d.attr({stroke: m}), this.updatePosition({
        plotX: f,
        plotY: g
      }), this.isHidden = !1);
      if (l) {
        l = ha(l);
        for (d = l.length; d--;) {
          if (e = a.series[d ? "yAxis" : "xAxis"], l[d]
          && e) {
            if (h = d ? o(a.stackY, a.y) : a.x, e.isLog && (h = ka(
                h)), e = e.getPlotLinePath(h,
                1), this.crosshairs[d]) {
              this.crosshairs[d].attr({
                d: e,
                visibility: "visible"
              });
            } else {
              h = {
                "stroke-width": l[d].width || 1,
                stroke: l[d].color || "#C0C0C0",
                zIndex: l[d].zIndex || 2
              };
              if (l[d].dashStyle) {
                h.dashstyle = l[d].dashStyle;
              }
              this.crosshairs[d] = c.renderer.path(e).attr(h).add()
            }
          }
        }
      }
      D(c, "tooltipRefresh",
          {text: j, x: f + c.plotLeft, y: g + c.plotTop, borderColor: m})
    }, updatePosition: function (a) {
      var b = this.chart, c = this.label,
          c = (this.options.positioner || this.getPosition).call(this, c.width,
              c.height, a);
      this.move(t(c.x), t(c.y), a.plotX + b.plotLeft, a.plotY + b.plotTop)
    }
  };
  rb.prototype = {
    init: function (a, b) {
      var c = $ ? "" : b.chart.zoomType, d = a.inverted, e;
      this.options = b;
      this.chart = a;
      this.zoomX = e = /x/.test(c);
      this.zoomY = c = /y/.test(c);
      this.zoomHor = e && !d || c && d;
      this.zoomVert = c && !d || e && d;
      this.pinchDown = [];
      this.lastValidTouch = {};
      if (b.tooltip.enabled) {
        a.tooltip = new qb(a, b.tooltip);
      }
      this.setDOMEvents()
    }, normalize: function (a) {
      var b, c, d, a = a || O.event;
      if (!a.target) {
        a.target = a.srcElement;
      }
      a = Qb(a);
      d = a.touches ? a.touches.item(0) : a;
      this.chartPosition = b = Ub(this.chart.container);
      d.pageX === y ? (c = a.x, b = a.y) : (c = d.pageX - b.left, b = d.pageY -
          b.top);
      return v(a, {chartX: t(c), chartY: t(b)})
    }, getCoordinates: function (a) {
      var b = {xAxis: [], yAxis: []};
      n(this.chart.axes, function (c) {
        b[c.isXAxis ? "xAxis" : "yAxis"].push(
            {axis: c, value: c.toValue(a[c.horiz ? "chartX" : "chartY"])})
      });
      return b
    }, getIndex: function (a) {
      var b = this.chart;
      return b.inverted ? b.plotHeight + b.plotTop - a.chartY : a.chartX
          - b.plotLeft
    }, runPointActions: function (a) {
      var b = this.chart, c = b.series, d = b.tooltip, e, f = b.hoverPoint,
          g = b.hoverSeries, h, i, j = b.chartWidth, k = this.getIndex(a);
      if (d && this.options.tooltip.shared &&
          (!g || !g.noSharedTooltip)) {
        e = [];
        h = c.length;
        for (i = 0; i < h; i++) {
          if (c[i].visible
              && c[i].options.enableMouseTracking !== !1
              && !c[i].noSharedTooltip
              && c[i].tooltipPoints.length
              && (b = c[i].tooltipPoints[k], b.series)) {
            b._dist = Q(k
                - b.clientX), j = K(j, b._dist), e.push(b);
          }
        }
        for (h = e.length; h--;) {
          e[h]._dist > j && e.splice(h, 1);
        }
        if (e.length && e[0].clientX !== this.hoverX) {
          d.refresh(e,
              a), this.hoverX = e[0].clientX
        }
      }
      if (g && g.tracker) {
        if ((b = g.tooltipPoints[k]) && b !== f) {
          b.onMouseOver(a)
        }
      } else {
        d && d.followPointer && !d.isHidden && (a = d.getAnchor([
          {}
        ], a),
            d.updatePosition({plotX: a[0], plotY: a[1]}))
      }
    }, reset: function (a) {
      var b = this.chart, c = b.hoverSeries, d = b.hoverPoint, e = b.tooltip,
          b = e && e.shared ? b.hoverPoints : d;
      (a = a && e && b) && ha(b)[0].plotX === y && (a = !1);
      if (a) {
        e.refresh(b);
      } else {
        if (d) {
          d.onMouseOut();
        }
        if (c) {
          c.onMouseOut();
        }
        e && (e.hide(), e.hideCrosshairs());
        this.hoverX = null
      }
    }, scaleGroups: function (a, b) {
      var c = this.chart;
      n(c.series, function (d) {
        d.xAxis && d.xAxis.zoomEnabled && (d.group.attr(a), d.markerGroup
        && (d.markerGroup.attr(a), d.markerGroup.clip(
            b ? c.clipRect : null)), d.dataLabelsGroup &&
        d.dataLabelsGroup.attr(a))
      });
      c.clipRect.attr(b || c.clipBox)
    }, pinchTranslateDirection: function (a, b, c, d, e, f, g) {
      var h = this.chart, i = a ? "x" : "y", j = a ? "X" : "Y", k = "chart" + j,
          m = a ? "width" : "height", l = h["plot" + (a ? "Left" : "Top")], p,
          s, o = 1, n = h.inverted, w = h.bounds[a ? "h" : "v"],
          q = b.length === 1, t = b[0][k], r = c[0][k], v = !q && b[1][k],
          u = !q && c[1][k], x, c = function () {
            !q && Q(t - v) > 20 && (o = Q(r - u) / Q(t - v));
            s = (l - r) / o + t;
            p = h["plot" + (a ? "Width" : "Height")] / o
          };
      c();
      b = s;
      b < w.min ? (b = w.min, x = !0) : b + p > w.max && (b = w.max
          - p, x = !0);
      x ? (r -= 0.8 * (r - g[i][0]), q || (u -=
          0.8 * (u - g[i][1])), c()) : g[i] = [r, u];
      n || (f[i] = s - l, f[m] = p);
      f = n ? 1 / o : o;
      e[m] = p;
      e[i] = b;
      d[n ? a ? "scaleY" : "scaleX" : "scale" + j] = o;
      d["translate" + j] = f * l + (r - f * t)
    }, pinch: function (a) {
      var b = this, c = b.chart, d = b.pinchDown,
          e = c.tooltip && c.tooltip.options.followTouchMove, f = a.touches,
          g = f.length, h = b.lastValidTouch, i = b.zoomHor || b.pinchHor,
          j = b.zoomVert || b.pinchVert, k = i || j, m = b.selectionMarker,
          l = {}, p = {};
      a.type === "touchstart" && (e || k) && a.preventDefault();
      La(f, function (a) {
        return b.normalize(a)
      });
      if (a.type === "touchstart") {
        n(f, function (a, b) {
          d[b] = {chartX: a.chartX, chartY: a.chartY}
        }), h.x = [d[0].chartX, d[1] && d[1].chartX], h.y = [d[0].chartY,
          d[1] && d[1].chartY], n(c.axes, function (a) {
          if (a.zoomEnabled) {
            var b = c.bounds[a.horiz ? "h" : "v"], d = a.minPixelPadding,
                e = a.toPixels(a.dataMin), f = a.toPixels(a.dataMax),
                g = K(e, f),
                e = q(e, f);
            b.min = K(a.pos, g - d);
            b.max = q(a.pos + a.len, e + d)
          }
        });
      } else if (d.length) {
        if (!m) {
          b.selectionMarker = m = v({destroy: ta}, c.plotBox);
        }
        i && b.pinchTranslateDirection(!0, d, f, l, m, p, h);
        j && b.pinchTranslateDirection(!1, d, f, l, m, p, h);
        b.hasPinched = k;
        b.scaleGroups(l,
            p);
        !k && e && g === 1 && this.runPointActions(b.normalize(a))
      }
    }, dragStart: function (a) {
      var b = this.chart;
      b.mouseIsDown = a.type;
      b.cancelClick = !1;
      b.mouseDownX = this.mouseDownX = a.chartX;
      this.mouseDownY = a.chartY
    }, drag: function (a) {
      var b = this.chart, c = b.options.chart, d = a.chartX, a = a.chartY,
          e = this.zoomHor, f = this.zoomVert, g = b.plotLeft, h = b.plotTop,
          i = b.plotWidth, j = b.plotHeight, k, m = this.mouseDownX,
          l = this.mouseDownY;
      d < g ? d = g : d > g + i && (d = g + i);
      a < h ? a = h : a > h + j && (a = h + j);
      this.hasDragged = Math.sqrt(Math.pow(m - d, 2) + Math.pow(l - a, 2));
      if (this.hasDragged >
          10) {
        k = b.isInsidePlot(m - g, l - h);
        if (b.hasCartesianSeries && (this.zoomX || this.zoomY) && k
            && !this.selectionMarker) {
          this.selectionMarker = b.renderer.rect(g,
              h, e ? 1 : i, f ? 1 : j, 0).attr({
            fill: c.selectionMarkerFill || "rgba(69,114,167,0.25)",
            zIndex: 7
          }).add();
        }
        this.selectionMarker && e && (e = d - m, this.selectionMarker.attr(
            {width: Q(e), x: (e > 0 ? 0 : e) + m}));
        this.selectionMarker && f && (e = a - l, this.selectionMarker.attr(
            {height: Q(e), y: (e > 0 ? 0 : e) + l}));
        k && !this.selectionMarker && c.panning && b.pan(d)
      }
    }, drop: function (a) {
      var b = this.chart, c = this.hasPinched;
      if (this.selectionMarker) {
        var d = {xAxis: [], yAxis: [], originalEvent: a.originalEvent || a},
            e = this.selectionMarker, f = e.x, g = e.y, h;
        if (this.hasDragged || c) {
          n(b.axes, function (a) {
            if (a.zoomEnabled) {
              var b = a.horiz, c = a.toValue(b ? f : g),
                  b = a.toValue(b ? f + e.width : g + e.height);
              !isNaN(c) && !isNaN(b) && (d[a.xOrY + "Axis"].push(
                  {axis: a, min: K(c, b), max: q(c, b)}), h = !0)
            }
          }), h && D(b, "selection", d, function (a) {
            b.zoom(v(a, c ? {animation: !1} : null))
          });
        }
        this.selectionMarker = this.selectionMarker.destroy();
        c && this.scaleGroups({
          translateX: b.plotLeft,
          translateY: b.plotTop, scaleX: 1, scaleY: 1
        })
      }
      if (b) {
        L(b.container,
            {cursor: b._cursor}), b.cancelClick = this.hasDragged
            > 10, b.mouseIsDown = this.hasDragged = this.hasPinched = !1, this.pinchDown = []
      }
    }, onContainerMouseDown: function (a) {
      a = this.normalize(a);
      a.preventDefault && a.preventDefault();
      this.dragStart(a)
    }, onDocumentMouseUp: function (a) {
      this.drop(a)
    }, onDocumentMouseMove: function (a) {
      var b = this.chart, c = this.chartPosition, d = b.hoverSeries, a = Qb(a);
      c && d && d.isCartesian && !b.isInsidePlot(a.pageX - c.left
          - b.plotLeft, a.pageY - c.top -
          b.plotTop) && this.reset()
    }, onContainerMouseLeave: function () {
      this.reset();
      this.chartPosition = null
    }, onContainerMouseMove: function (a) {
      var b = this.chart, a = this.normalize(a);
      a.returnValue = !1;
      b.mouseIsDown === "mousedown" && this.drag(a);
      b.isInsidePlot(a.chartX - b.plotLeft, a.chartY - b.plotTop) && !b.openMenu
      && this.runPointActions(a)
    }, inClass: function (a, b) {
      for (var c; a;) {
        if (c = A(a, "class")) {
          if (c.indexOf(b)
              !== -1) {
            return !0;
          } else if (c.indexOf("highcharts-container")
              !== -1) {
            return !1;
          }
        }
        a = a.parentNode
      }
    }, onTrackerMouseOut: function (a) {
      var b =
          this.chart.hoverSeries;
      if (b && !b.options.stickyTracking && !this.inClass(a.toElement
          || a.relatedTarget, "highcharts-tooltip")) {
        b.onMouseOut()
      }
    }, onContainerClick: function (a) {
      var b = this.chart, c = b.hoverPoint, d = b.plotLeft, e = b.plotTop,
          f = b.inverted, g, h, i, a = this.normalize(a);
      a.cancelBubble = !0;
      if (!b.cancelClick) {
        c && this.inClass(a.target, "highcharts-tracker")
            ? (g = this.chartPosition, h = c.plotX, i = c.plotY, v(c, {
              pageX: g.left + d + (f ? b.plotWidth - i : h),
              pageY: g.top + e + (f ? b.plotHeight - h : i)
            }), D(c.series, "click", v(a, {point: c})), b.hoverPoint &&
            c.firePointEvent("click", a)) : (v(a,
            this.getCoordinates(a)), b.isInsidePlot(a.chartX - d, a.chartY
            - e) && D(b, "click", a))
      }
    }, onContainerTouchStart: function (a) {
      var b = this.chart;
      a.touches.length === 1 ? (a = this.normalize(a), b.isInsidePlot(a.chartX
          - b.plotLeft, a.chartY - b.plotTop) && (this.runPointActions(
          a), this.pinch(a))) : a.touches.length === 2 && this.pinch(a)
    }, onContainerTouchMove: function (a) {
      (a.touches.length === 1 || a.touches.length === 2) && this.pinch(a)
    }, onDocumentTouchEnd: function (a) {
      this.drop(a)
    }, setDOMEvents: function () {
      var a =
          this, b = a.chart.container, c;
      this._events = c = [
        [b, "onmousedown", "onContainerMouseDown"],
        [b, "onmousemove", "onContainerMouseMove"],
        [b, "onclick", "onContainerClick"],
        [b, "mouseleave", "onContainerMouseLeave"],
        [z, "mousemove", "onDocumentMouseMove"],
        [z, "mouseup", "onDocumentMouseUp"]
      ];
      fb && c.push([b, "ontouchstart", "onContainerTouchStart"],
          [b, "ontouchmove", "onContainerTouchMove"],
          [z, "touchend", "onDocumentTouchEnd"]);
      n(c, function (b) {
        a["_" + b[2]] = function (c) {
          a[b[2]](c)
        };
        b[1].indexOf("on") === 0 ? b[0][b[1]] = a["_" + b[2]] :
            J(b[0], b[1], a["_" + b[2]])
      })
    }, destroy: function () {
      var a = this;
      n(a._events, function (b) {
        b[1].indexOf("on") === 0 ? b[0][b[1]] = null : ba(b[0], b[1],
            a["_" + b[2]])
      });
      delete a._events;
      clearInterval(a.tooltipTimeout)
    }
  };
  sb.prototype = {
    init: function (a, b) {
      var c = this, d = b.itemStyle, e = o(b.padding, 8),
          f = b.itemMarginTop || 0;
      this.options = b;
      if (b.enabled) {
        c.baseline = u(d.fontSize) + 3
            + f, c.itemStyle = d, c.itemHiddenStyle = x(d,
            b.itemHiddenStyle), c.itemMarginTop = f, c.padding = e, c.initialItemX = e, c.initialItemY = e
            - 5, c.maxItemWidth = 0, c.chart = a,
            c.itemHeight = 0, c.lastLineHeight = 0, c.render(), J(c.chart,
            "endResize", function () {
              c.positionCheckboxes()
            })
      }
    }, colorizeItem: function (a, b) {
      var c = this.options, d = a.legendItem, e = a.legendLine,
          f = a.legendSymbol, g = this.itemHiddenStyle.color,
          c = b ? c.itemStyle.color : g, h = b ? a.color : g,
          g = a.options && a.options.marker, i = {
            stroke: h,
            fill: h
          }, j;
      d && d.css({fill: c, color: c});
      e && e.attr({stroke: h});
      if (f) {
        if (g) {
          for (j in g = a.convertAttribs(g), g) {
            d = g[j], d !== y
            && (i[j] = d);
          }
        }
        f.attr(i)
      }
    }, positionItem: function (a) {
      var b = this.options, c = b.symbolPadding,
          b = !b.rtl, d = a._legendItemPos, e = d[0], d = d[1], f = a.checkbox;
      a.legendGroup && a.legendGroup.translate(
          b ? e : this.legendWidth - e - 2 * c - 4, d);
      if (f) {
        f.x = e, f.y = d
      }
    }, destroyItem: function (a) {
      var b = a.checkbox;
      n(["legendItem", "legendLine", "legendSymbol", "legendGroup"],
          function (b) {
            a[b] && a[b].destroy()
          });
      b && Ra(a.checkbox)
    }, destroy: function () {
      var a = this.group, b = this.box;
      if (b) {
        this.box = b.destroy();
      }
      if (a) {
        this.group = a.destroy()
      }
    }, positionCheckboxes: function (a) {
      var b = this.group.alignAttr, c, d = this.clipHeight || this.legendHeight;
      if (b) {
        c =
            b.translateY, n(this.allItems, function (e) {
          var f = e.checkbox, g;
          f && (g = c + f.y + (a || 0) + 3, L(f, {
            left: b.translateX + e.legendItemWidth + f.x - 20 + "px",
            top: g + "px",
            display: g > c - 6 && g < c + d - 6 ? "" : S
          }))
        })
      }
    }, renderTitle: function () {
      var a = this.padding, b = this.options.title, c = 0;
      if (b.text) {
        if (!this.title) {
          this.title = this.chart.renderer.label(b.text, a - 3, a
              - 4, null, null, null, null, null, "legend-title").attr(
              {zIndex: 1}).css(b.style).add(this.group);
        }
        c = this.title.getBBox().height;
        this.contentGroup.attr({translateY: c})
      }
      this.titleHeight = c
    }, renderItem: function (a) {
      var w;
      var b = this, c = b.chart, d = c.renderer, e = b.options,
          f = e.layout === "horizontal", g = e.symbolWidth, h = e.symbolPadding,
          i = b.itemStyle, j = b.itemHiddenStyle, k = b.padding, m = !e.rtl,
          l = e.width, p = e.itemMarginBottom || 0, s = b.itemMarginTop,
          o = b.initialItemX, n = a.legendItem, t = a.series || a,
          r = t.options, v = r.showCheckbox, u = e.useHTML;
      if (!n && (a.legendGroup = d.g("legend-item").attr({zIndex: 1}).add(
          b.scrollGroup), t.drawLegendSymbol(b, a), a.legendItem = n = d.text(
          e.labelFormat ? wa(e.labelFormat, a) : e.labelFormatter.call(a),
          m ? g + h : -h, b.baseline,
          u).css(x(a.visible ? i : j)).attr({
        align: m ? "left" : "right",
        zIndex: 2
      }).add(a.legendGroup), (u ? n : a.legendGroup).on("mouseover",
          function () {
            a.setState("hover");
            n.css(b.options.itemHoverStyle)
          }).on("mouseout", function () {
        n.css(a.visible ? i : j);
        a.setState()
      }).on("click", function (b) {
        var c = function () {
          a.setVisible()
        }, b = {browserEvent: b};
        a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : D(a,
            "legendItemClick", b, c)
      }), b.colorizeItem(a, a.visible), r && v)) {
        a.checkbox = U("input", {
              type: "checkbox",
              checked: a.selected,
              defaultChecked: a.selected
            },
            e.itemCheckboxStyle, c.container), J(a.checkbox, "click",
            function (b) {
              D(a, "checkboxClick", {checked: b.target.checked}, function () {
                a.select()
              })
            });
      }
      d = n.getBBox();
      w = a.legendItemWidth = e.itemWidth || g + h + d.width + k + (v ? 20
          : 0), e = w;
      b.itemHeight = g = d.height;
      if (f && b.itemX - o + e > (l || c.chartWidth - 2 * k
          - o)) {
        b.itemX = o, b.itemY += s + b.lastLineHeight
            + p, b.lastLineHeight = 0;
      }
      b.maxItemWidth = q(b.maxItemWidth, e);
      b.lastItemY = s + b.itemY + p;
      b.lastLineHeight = q(g, b.lastLineHeight);
      a._legendItemPos = [b.itemX, b.itemY];
      f ? b.itemX += e : (b.itemY += s + g + p, b.lastLineHeight =
          g);
      b.offsetWidth = l || q(f ? b.itemX - o : e, b.offsetWidth)
    }, render: function () {
      var a = this, b = a.chart, c = b.renderer, d = a.group, e, f, g, h,
          i = a.box, j = a.options, k = a.padding, m = j.borderWidth,
          l = j.backgroundColor;
      a.itemX = a.initialItemX;
      a.itemY = a.initialItemY;
      a.offsetWidth = 0;
      a.lastItemY = 0;
      if (!d) {
        a.group = d = c.g("legend").attr(
            {zIndex: 7}).add(), a.contentGroup = c.g().attr({zIndex: 1}).add(
            d), a.scrollGroup = c.g().add(a.contentGroup);
      }
      a.renderTitle();
      e = [];
      n(b.series, function (a) {
        var b = a.options;
        b.showInLegend && !r(b.linkedTo) && (e = e.concat(a.legendItems ||
            (b.legendType === "point" ? a.data : a)))
      });
      Ib(e, function (a, b) {
        return (a.options && a.options.legendIndex || 0) - (b.options
            && b.options.legendIndex || 0)
      });
      j.reversed && e.reverse();
      a.allItems = e;
      a.display = f = !!e.length;
      n(e, function (b) {
        a.renderItem(b)
      });
      g = j.width || a.offsetWidth;
      h = a.lastItemY + a.lastLineHeight + a.titleHeight;
      h = a.handleOverflow(h);
      if (m || l) {
        g += k;
        h += k;
        if (i) {
          if (g > 0 && h > 0) {
            i[i.isNew ? "attr" : "animate"](
                i.crisp(null, null, null, g, h)), i.isNew = !1
          }
        } else {
          a.box = i = c.rect(0, 0, g, h, j.borderRadius, m || 0).attr({
            stroke: j.borderColor,
            "stroke-width": m || 0, fill: l || S
          }).add(d).shadow(j.shadow), i.isNew = !0;
        }
        i[f ? "show" : "hide"]()
      }
      a.legendWidth = g;
      a.legendHeight = h;
      n(e, function (b) {
        a.positionItem(b)
      });
      f && d.align(v({width: g, height: h}, j), !0, "spacingBox");
      b.isResizing || this.positionCheckboxes()
    }, handleOverflow: function (a) {
      var b = this, c = this.chart, d = c.renderer, e = this.options, f = e.y,
          f = c.spacingBox.height + (e.verticalAlign === "top" ? -f : f)
              - this.padding, g = e.maxHeight, h = this.clipRect,
          i = e.navigation, j = o(i.animation, !0), k = i.arrowSize || 12,
          m = this.nav;
      e.layout ===
      "horizontal" && (f /= 2);
      g && (f = K(f, g));
      if (a > f && !e.useHTML) {
        this.clipHeight = c = f - 20 - this.titleHeight;
        this.pageCount = ja(a / c);
        this.currentPage = o(this.currentPage, 1);
        this.fullHeight = a;
        if (!h) {
          h = b.clipRect = d.clipRect(0, 0, 9999, 0), b.contentGroup.clip(
              h);
        }
        h.attr({height: c});
        if (!m) {
          this.nav = m = d.g().attr({zIndex: 1}).add(
              this.group), this.up = d.symbol("triangle", 0, 0, k, k).on(
              "click",
              function () {
                b.scroll(-1, j)
              }).add(m), this.pager = d.text("", 15, 10).css(i.style).add(
              m), this.down = d.symbol("triangle-down", 0, 0, k, k).on("click",
              function () {
                b.scroll(1, j)
              }).add(m);
        }
        b.scroll(0);
        a = f
      } else if (m) {
        h.attr(
            {height: c.chartHeight}), m.hide(), this.scrollGroup.attr(
            {translateY: 1}), this.clipHeight = 0;
      }
      return a
    }, scroll: function (a, b) {
      var c = this.pageCount, d = this.currentPage + a, e = this.clipHeight,
          f = this.options.navigation, g = f.activeColor, h = f.inactiveColor,
          f = this.pager, i = this.padding;
      d > c && (d = c);
      if (d > 0) {
        b !== y && Ia(b, this.chart), this.nav.attr({
          translateX: i,
          translateY: e + 7 + this.titleHeight,
          visibility: "visible"
        }), this.up.attr({fill: d === 1 ? h : g}).css({
          cursor: d ===
          1 ? "default" : "pointer"
        }), f.attr({text: d + "/" + this.pageCount}), this.down.attr({
          x: 18 + this.pager.getBBox().width,
          fill: d === c ? h : g
        }).css({cursor: d === c ? "default" : "pointer"}), e = -K(e * (d
            - 1), this.fullHeight - e + i) + 1, this.scrollGroup.animate(
            {translateY: e}), f.attr(
            {text: d + "/" + c}), this.currentPage = d, this.positionCheckboxes(
            e)
      }
    }
  };
  tb.prototype = {
    init: function (a, b) {
      var c, d = a.series;
      a.series = null;
      c = x(N, a);
      c.series = a.series = d;
      var d = c.chart, e = d.margin, e = V(e) ? e : [e, e, e, e];
      this.optionsMarginTop = o(d.marginTop, e[0]);
      this.optionsMarginRight =
          o(d.marginRight, e[1]);
      this.optionsMarginBottom = o(d.marginBottom, e[2]);
      this.optionsMarginLeft = o(d.marginLeft, e[3]);
      this.runChartClick = (e = d.events) && !!e.click;
      this.bounds = {h: {}, v: {}};
      this.callback = b;
      this.isResizing = 0;
      this.options = c;
      this.axes = [];
      this.series = [];
      this.hasCartesianSeries = d.showAxes;
      var f = this, g;
      f.index = Ba.length;
      Ba.push(f);
      d.reflow !== !1 && J(f, "load", function () {
        f.initReflow()
      });
      if (e) {
        for (g in e) {
          J(f, g, e[g]);
        }
      }
      f.xAxis = [];
      f.yAxis = [];
      f.animation = $ ? !1 : o(d.animation, !0);
      f.pointCount = 0;
      f.counters = new Hb;
      f.firstRender()
    }, initSeries: function (a) {
      var b = this.options.chart;
      (b = aa[a.type || b.type || b.defaultSeriesType]) || qa(17, !0);
      b = new b;
      b.init(this, a);
      return b
    }, addSeries: function (a, b, c) {
      var d, e = this;
      a && (b = o(b, !0), D(e, "addSeries", {options: a}, function () {
        d = e.initSeries(a);
        e.isDirtyLegend = !0;
        b && e.redraw(c)
      }));
      return d
    }, addAxis: function (a, b, c, d) {
      var b = b ? "xAxis" : "yAxis", e = this.options;
      new ab(this, x(a, {index: this[b].length}));
      e[b] = ha(e[b] || {});
      e[b].push(a);
      o(c, !0) && this.redraw(d)
    }, isInsidePlot: function (a, b, c) {
      var d =
          c ? b : a, a = c ? a : b;
      return d >= 0 && d <= this.plotWidth && a >= 0 && a <= this.plotHeight
    }, adjustTickAmounts: function () {
      this.options.chart.alignTicks !== !1 && n(this.axes, function (a) {
        a.adjustTickAmount()
      });
      this.maxTicks = null
    }, redraw: function (a) {
      var b = this.axes, c = this.series, d = this.pointer, e = this.legend,
          f = this.isDirtyLegend, g, h = this.isDirtyBox, i = c.length, j = i,
          k = this.renderer, m = k.isHidden(), l = [];
      Ia(a, this);
      for (m && this.cloneRenderTo(); j--;) {
        if (a = c[j], a.isDirty
        && a.options.stacking) {
          g = !0;
          break
        }
      }
      if (g) {
        for (j = i; j--;) {
          if (a = c[j], a.options.stacking) {
            a.isDirty = !0;
          }
        }
      }
      n(c, function (a) {
        a.isDirty && a.options.legendType === "point" && (f = !0)
      });
      if (f && e.options.enabled) {
        e.render(), this.isDirtyLegend = !1;
      }
      if (this.hasCartesianSeries) {
        if (!this.isResizing) {
          this.maxTicks = null, n(b, function (a) {
            a.setScale()
          });
        }
        this.adjustTickAmounts();
        this.getMargins();
        n(b, function (a) {
          if (a.isDirtyExtremes) {
            a.isDirtyExtremes = !1, l.push(function () {
              D(a, "afterSetExtremes", a.getExtremes())
            });
          }
          if (a.isDirty || h || g) {
            a.redraw(), h = !0
          }
        })
      }
      h && this.drawChartBox();
      n(c, function (a) {
        a.isDirty && a.visible && (!a.isCartesian ||
            a.xAxis) && a.redraw()
      });
      d && d.reset && d.reset(!0);
      k.draw();
      D(this, "redraw");
      m && this.cloneRenderTo(!0);
      n(l, function (a) {
        a.call()
      })
    }, showLoading: function (a) {
      var b = this.options, c = this.loadingDiv, d = b.loading;
      if (!c) {
        this.loadingDiv = c = U(ya, {className: "highcharts-loading"},
            v(d.style, {
              zIndex: 10,
              display: S
            }), this.container), this.loadingSpan = U("span", null,
            d.labelStyle,
            c);
      }
      this.loadingSpan.innerHTML = a || b.lang.loading;
      if (!this.loadingShown) {
        L(c, {
          opacity: 0,
          display: "",
          left: this.plotLeft + "px",
          top: this.plotTop + "px",
          width: this.plotWidth +
          "px",
          height: this.plotHeight + "px"
        }), wb(c, {opacity: d.style.opacity},
            {duration: d.showDuration || 0}), this.loadingShown = !0
      }
    }, hideLoading: function () {
      var a = this.options, b = this.loadingDiv;
      b && wb(b, {opacity: 0}, {
        duration: a.loading.hideDuration || 100, complete: function () {
          L(b, {display: S})
        }
      });
      this.loadingShown = !1
    }, get: function (a) {
      var b = this.axes, c = this.series, d, e;
      for (d = 0; d < b.length; d++) {
        if (b[d].options.id === a) {
          return b[d];
        }
      }
      for (d = 0; d < c.length; d++) {
        if (c[d].options.id === a) {
          return c[d];
        }
      }
      for (d = 0; d < c.length; d++) {
        e = c[d].points ||
            [];
        for (b = 0; b < e.length; b++) {
          if (e[b].id === a) {
            return e[b]
          }
        }
      }
      return null
    }, getAxes: function () {
      var a = this, b = this.options, c = b.xAxis = ha(b.xAxis || {}),
          b = b.yAxis = ha(b.yAxis || {});
      n(c, function (a, b) {
        a.index = b;
        a.isX = !0
      });
      n(b, function (a, b) {
        a.index = b
      });
      c = c.concat(b);
      n(c, function (b) {
        new ab(a, b)
      });
      a.adjustTickAmounts()
    }, getSelectedPoints: function () {
      var a = [];
      n(this.series, function (b) {
        a = a.concat(ob(b.points || [], function (a) {
          return a.selected
        }))
      });
      return a
    }, getSelectedSeries: function () {
      return ob(this.series, function (a) {
        return a.selected
      })
    },
    showResetZoom: function () {
      var a = this, b = N.lang, c = a.options.chart.resetZoomButton,
          d = c.theme, e = d.states,
          f = c.relativeTo === "chart" ? null : "plotBox";
      this.resetZoomButton = a.renderer.button(b.resetZoom, null, null,
          function () {
            a.zoomOut()
          }, d, e && e.hover).attr(
          {align: c.position.align, title: b.resetZoomTitle}).add().align(
          c.position, !1, f)
    }, zoomOut: function () {
      var a = this;
      D(a, "selection", {resetSelection: !0}, function () {
        a.zoom()
      })
    }, zoom: function (a) {
      var b, c = this.pointer, d = !1, e;
      !a || a.resetSelection ? n(this.axes, function (a) {
        b =
            a.zoom()
      }) : n(a.xAxis.concat(a.yAxis), function (a) {
        var e = a.axis, h = e.isXAxis;
        if (c[h ? "zoomX" : "zoomY"] || c[h ? "pinchX" : "pinchY"]) {
          b = e.zoom(
              a.min, a.max), e.displayBtn && (d = !0)
        }
      });
      e = this.resetZoomButton;
      if (d && !e) {
        this.showResetZoom();
      } else if (!d && V(
          e)) {
        this.resetZoomButton = e.destroy();
      }
      b && this.redraw(
          o(this.options.chart.animation, a && a.animation, this.pointCount
              < 100))
    }, pan: function (a) {
      var b = this.xAxis[0], c = this.mouseDownX, d = b.pointRange / 2,
          e = b.getExtremes(), f = b.translate(c - a, !0) + d,
          c = b.translate(c + this.plotWidth - a, !0) -
              d;
      (d = this.hoverPoints) && n(d, function (a) {
        a.setState()
      });
      b.series.length && f > K(e.dataMin, e.min) && c < q(e.dataMax, e.max)
      && b.setExtremes(f, c, !0, !1, {trigger: "pan"});
      this.mouseDownX = a;
      L(this.container, {cursor: "move"})
    }, setTitle: function (a, b) {
      var f;
      var c = this, d = c.options, e;
      e = d.title = x(d.title, a);
      f = d.subtitle = x(d.subtitle, b), d = f;
      n([
        ["title", a, e],
        ["subtitle", b, d]
      ], function (a) {
        var b = a[0], d = c[b], e = a[1], a = a[2];
        d && e && (c[b] = d = d.destroy());
        a && a.text && !d && (c[b] = c.renderer.text(a.text, 0, 0,
            a.useHTML).attr({
          align: a.align,
          "class": "highcharts-" + b, zIndex: a.zIndex || 4
        }).css(a.style).add().align(a, !1, "spacingBox"))
      })
    }, getChartSize: function () {
      var a = this.options.chart, b = this.renderToClone || this.renderTo;
      this.containerWidth = gb(b, "width");
      this.containerHeight = gb(b, "height");
      this.chartWidth = q(0, a.width || this.containerWidth || 600);
      this.chartHeight = q(0,
          o(a.height, this.containerHeight > 19 ? this.containerHeight : 400))
    }, cloneRenderTo: function (a) {
      var b = this.renderToClone, c = this.container;
      a ? b && (this.renderTo.appendChild(c), Ra(b), delete this.renderToClone)
          :
          (c && this.renderTo.removeChild(
              c), this.renderToClone = b = this.renderTo.cloneNode(0), L(b, {
            position: "absolute",
            top: "-9999px",
            display: "block"
          }), z.body.appendChild(b), c && b.appendChild(c))
    }, getContainer: function () {
      var a, b = this.options.chart, c, d, e;
      this.renderTo = a = b.renderTo;
      e = "highcharts-" + ub++;
      if (fa(a)) {
        this.renderTo = a = z.getElementById(a);
      }
      a || qa(13, !0);
      c = u(A(a, "data-highcharts-chart"));
      !isNaN(c) && Ba[c] && Ba[c].destroy();
      A(a, "data-highcharts-chart", this.index);
      a.innerHTML = "";
      a.offsetWidth || this.cloneRenderTo();
      this.getChartSize();
      c = this.chartWidth;
      d = this.chartHeight;
      this.container = a = U(ya, {
        className: "highcharts-container" + (b.className ? " " + b.className
            : ""),
        id: e
      }, v({
        position: "relative",
        overflow: "hidden",
        width: c + "px",
        height: d + "px",
        textAlign: "left",
        lineHeight: "normal",
        zIndex: 0,
        "-webkit-tap-highlight-color": "rgba(0,0,0,0)"
      }, b.style), this.renderToClone || a);
      this._cursor = a.style.cursor;
      this.renderer = b.forExport ? new Ca(a, c, d, !0) : new Sa(a, c, d);
      $ && this.renderer.create(this, a, c, d)
    }, getMargins: function () {
      var a = this.options.chart,
          b = a.spacingTop, c = a.spacingRight, d = a.spacingBottom,
          a = a.spacingLeft, e, f = this.legend, g = this.optionsMarginTop,
          h = this.optionsMarginLeft, i = this.optionsMarginRight,
          j = this.optionsMarginBottom, k = this.options.title,
          m = this.options.subtitle, l = this.options.legend,
          p = o(l.margin, 10), s = l.x, t = l.y, B = l.align,
          w = l.verticalAlign;
      this.resetMargins();
      e = this.axisOffset;
      if ((this.title || this.subtitle) && !r(
          this.optionsMarginTop)) {
        if (m = q(this.title && !k.floating
            && !k.verticalAlign && k.y || 0, this.subtitle && !m.floating
            && !m.verticalAlign &&
            m.y || 0)) {
          this.plotTop = q(this.plotTop, m + o(k.margin, 15) + b);
        }
      }
      if (f.display && !l.floating) {
        if (B === "right") {
          if (!r(i)) {
            this.marginRight = q(this.marginRight, f.legendWidth - s + p
                + c)
          }
        } else if (B === "left") {
          if (!r(h)) {
            this.plotLeft = q(this.plotLeft, f.legendWidth + s + p + a)
          }
        } else if (w === "top") {
          if (!r(g)) {
            this.plotTop = q(this.plotTop, f.legendHeight + t + p + b)
          }
        } else if (w === "bottom" && !r(j)) {
          this.marginBottom = q(
              this.marginBottom, f.legendHeight - t + p + d);
        }
      }
      this.extraBottomMargin && (this.marginBottom += this.extraBottomMargin);
      this.extraTopMargin && (this.plotTop +=
          this.extraTopMargin);
      this.hasCartesianSeries && n(this.axes, function (a) {
        a.getOffset()
      });
      r(h) || (this.plotLeft += e[3]);
      r(g) || (this.plotTop += e[0]);
      r(j) || (this.marginBottom += e[2]);
      r(i) || (this.marginRight += e[1]);
      this.setChartSize()
    }, initReflow: function () {
      function a(a) {
        var g = c.width || gb(d, "width"), h = c.height || gb(d, "height"),
            a = a ? a.target : O;
        if (!b.hasUserSize && g && h && (a === O || a === z)) {
          if (g !== b.containerWidth || h !== b.containerHeight) {
            clearTimeout(
                e), b.reflowTimeout = e = setTimeout(function () {
              if (b.container) {
                b.setSize(g,
                    h, !1), b.hasUserSize = null
              }
            }, 100);
          }
          b.containerWidth = g;
          b.containerHeight = h
        }
      }

      var b = this, c = b.options.chart, d = b.renderTo, e;
      J(O, "resize", a);
      J(b, "destroy", function () {
        ba(O, "resize", a)
      })
    }, setSize: function (a, b, c) {
      var d = this, e, f, g;
      d.isResizing += 1;
      g = function () {
        d && D(d, "endResize", null, function () {
          d.isResizing -= 1
        })
      };
      Ia(c, d);
      d.oldChartHeight = d.chartHeight;
      d.oldChartWidth = d.chartWidth;
      if (r(a)) {
        d.chartWidth = e = q(0, t(a)), d.hasUserSize = !!e;
      }
      if (r(b)) {
        d.chartHeight = f = q(0, t(b));
      }
      L(d.container, {width: e + "px", height: f + "px"});
      d.setChartSize(!0);
      d.renderer.setSize(e, f, c);
      d.maxTicks = null;
      n(d.axes, function (a) {
        a.isDirty = !0;
        a.setScale()
      });
      n(d.series, function (a) {
        a.isDirty = !0
      });
      d.isDirtyLegend = !0;
      d.isDirtyBox = !0;
      d.getMargins();
      d.redraw(c);
      d.oldChartHeight = null;
      D(d, "resize");
      za === !1 ? g() : setTimeout(g, za && za.duration || 500)
    }, setChartSize: function (a) {
      var b = this.inverted, c = this.renderer, d = this.chartWidth,
          e = this.chartHeight, f = this.options.chart, g = f.spacingTop,
          h = f.spacingRight, i = f.spacingBottom, j = f.spacingLeft,
          k = this.clipOffset, m, l, p, o;
      this.plotLeft = m =
          t(this.plotLeft);
      this.plotTop = l = t(this.plotTop);
      this.plotWidth = p = q(0, t(d - m - this.marginRight));
      this.plotHeight = o = q(0, t(e - l - this.marginBottom));
      this.plotSizeX = b ? o : p;
      this.plotSizeY = b ? p : o;
      this.plotBorderWidth = b = f.plotBorderWidth || 0;
      this.spacingBox = c.spacingBox = {
        x: j,
        y: g,
        width: d - j - h,
        height: e - g - i
      };
      this.plotBox = c.plotBox = {x: m, y: l, width: p, height: o};
      c = ja(q(b, k[3]) / 2);
      d = ja(q(b, k[0]) / 2);
      this.clipBox = {
        x: c,
        y: d,
        width: T(this.plotSizeX - q(b, k[1]) / 2 - c),
        height: T(this.plotSizeY - q(b, k[2]) / 2 - d)
      };
      a || n(this.axes, function (a) {
        a.setAxisSize();
        a.setAxisTranslation()
      })
    }, resetMargins: function () {
      var a = this.options.chart, b = a.spacingRight, c = a.spacingBottom,
          d = a.spacingLeft;
      this.plotTop = o(this.optionsMarginTop, a.spacingTop);
      this.marginRight = o(this.optionsMarginRight, b);
      this.marginBottom = o(this.optionsMarginBottom, c);
      this.plotLeft = o(this.optionsMarginLeft, d);
      this.axisOffset = [0, 0, 0, 0];
      this.clipOffset = [0, 0, 0, 0]
    }, drawChartBox: function () {
      var a = this.options.chart, b = this.renderer, c = this.chartWidth,
          d = this.chartHeight, e = this.chartBackground,
          f = this.plotBackground,
          g = this.plotBorder, h = this.plotBGImage, i = a.borderWidth || 0,
          j = a.backgroundColor, k = a.plotBackgroundColor,
          m = a.plotBackgroundImage, l = a.plotBorderWidth || 0, p,
          o = this.plotLeft, n = this.plotTop, t = this.plotWidth,
          q = this.plotHeight, r = this.plotBox, v = this.clipRect,
          u = this.clipBox;
      p = i + (a.shadow ? 8 : 0);
      if (i || j) {
        if (e) {
          e.animate(
              e.crisp(null, null, null, c - p, d - p));
        } else {
          e = {fill: j || S};
          if (i) {
            e.stroke = a.borderColor, e["stroke-width"] = i;
          }
          this.chartBackground = b.rect(p / 2, p / 2, c - p, d - p,
              a.borderRadius, i).attr(e).add().shadow(a.shadow)
        }
      }
      if (k) {
        f ?
            f.animate(r) : this.plotBackground = b.rect(o, n, t, q, 0).attr(
            {fill: k}).add().shadow(a.plotShadow);
      }
      if (m) {
        h ? h.animate(r) : this.plotBGImage = b.image(m, o, n, t, q).add();
      }
      v ? v.animate({width: u.width, height: u.height})
          : this.clipRect = b.clipRect(u);
      if (l) {
        g ? g.animate(g.crisp(null, o, n, t, q))
            : this.plotBorder = b.rect(o, n, t, q, 0, l).attr({
              stroke: a.plotBorderColor,
              "stroke-width": l,
              zIndex: 1
            }).add();
      }
      this.isDirtyBox = !1
    }, propFromSeries: function () {
      var a = this, b = a.options.chart, c, d = a.options.series, e, f;
      n(["inverted", "angular", "polar"],
          function (g) {
            c = aa[b.type || b.defaultSeriesType];
            f = a[g] || b[g] || c && c.prototype[g];
            for (e = d && d.length; !f && e--;) {
              (c = aa[d[e].type])
              && c.prototype[g] && (f = !0);
            }
            a[g] = f
          })
    }, render: function () {
      var a = this, b = a.axes, c = a.renderer, d = a.options, e = d.labels,
          f = d.credits, g;
      a.setTitle();
      a.legend = new sb(a, d.legend);
      n(b, function (a) {
        a.setScale()
      });
      a.getMargins();
      a.maxTicks = null;
      n(b, function (a) {
        a.setTickPositions(!0);
        a.setMaxTicks()
      });
      a.adjustTickAmounts();
      a.getMargins();
      a.drawChartBox();
      a.hasCartesianSeries && n(b, function (a) {
        a.render()
      });
      if (!a.seriesGroup) {
        a.seriesGroup = c.g("series-group").attr(
            {zIndex: 3}).add();
      }
      n(a.series, function (a) {
        a.translate();
        a.setTooltipPoints();
        a.render()
      });
      e.items && n(e.items, function (b) {
        var d = v(e.style, b.style), f = u(d.left) + a.plotLeft,
            g = u(d.top) + a.plotTop + 12;
        delete d.left;
        delete d.top;
        c.text(b.html, f, g).attr({zIndex: 2}).css(d).add()
      });
      if (f.enabled && !a.credits) {
        g = f.href, a.credits = c.text(f.text, 0,
            0).on("click", function () {
          if (g) {
            location.href = g
          }
        }).attr({align: f.position.align, zIndex: 8}).css(f.style).add().align(
            f.position);
      }
      a.hasRendered = !0
    }, destroy: function () {
      var a = this, b = a.axes, c = a.series, d = a.container, e,
          f = d && d.parentNode;
      D(a, "destroy");
      Ba[a.index] = y;
      a.renderTo.removeAttribute("data-highcharts-chart");
      ba(a);
      for (e = b.length; e--;) {
        b[e] = b[e].destroy();
      }
      for (e = c.length; e--;) {
        c[e] = c[e].destroy();
      }
      n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(
          ","), function (b) {
        var c = a[b];
        c && c.destroy && (a[b] = c.destroy())
      });
      if (d) {
        d.innerHTML = "", ba(d), f && Ra(d);
      }
      for (e in a) {
        delete a[e]
      }
    }, isReadyToRender: function () {
      var a = this;
      return !Z && O == O.top && z.readyState !== "complete" || $ && !O.canvg
          ? ($ ? Rb.push(function () {
            a.firstRender()
          }, a.options.global.canvasToolsURL) : z.attachEvent(
              "onreadystatechange", function () {
                z.detachEvent("onreadystatechange", a.firstRender);
                z.readyState === "complete" && a.firstRender()
              }), !1) : !0
    }, firstRender: function () {
      var a = this, b = a.options, c = a.callback;
      if (a.isReadyToRender()) {
        a.getContainer(), D(a, "init"), a.resetMargins(),
            a.setChartSize(), a.propFromSeries(), a.getAxes(), n(b.series || [],
            function (b) {
              a.initSeries(b)
            }), D(a, "beforeRender"), a.pointer = new rb(a,
            b), a.render(), a.renderer.draw(), c && c.apply(a, [a]), n(
            a.callbacks, function (b) {
              b.apply(a, [a])
            }), a.cloneRenderTo(!0), D(a, "load")
      }
    }
  };
  tb.prototype.callbacks = [];
  var Na = function () {
  };
  Na.prototype = {
    init: function (a, b, c) {
      this.series = a;
      this.applyOptions(b, c);
      this.pointAttr = {};
      if (a.options.colorByPoint && (b = a.options.colors
          || a.chart.options.colors, this.color = this.color
          || b[a.colorCounter++],
      a.colorCounter === b.length)) {
        a.colorCounter = 0;
      }
      a.chart.pointCount++;
      return this
    }, applyOptions: function (a, b) {
      var c = this.series, d = c.pointValKey,
          a = Na.prototype.optionsToObject.call(this, a);
      v(this, a);
      this.options = this.options ? v(this.options, a) : a;
      if (d) {
        this.y = this[d];
      }
      if (this.x === y && c) {
        this.x = b === y ? c.autoIncrement() : b;
      }
      return this
    }, optionsToObject: function (a) {
      var b, c = this.series, d = c.pointArrayMap || ["y"], e = d.length, f = 0,
          g = 0;
      if (typeof a === "number" || a === null) {
        b = {y: a};
      } else if (Da(a)) {
        b = {};
        if (a.length > e) {
          c = typeof a[0];
          if (c === "string") {
            b.name = a[0];
          } else if (c
              === "number") {
            b.x = a[0];
          }
          f++
        }
        for (; g < e;) {
          b[d[g++]] = a[f++]
        }
      } else if (typeof a === "object") {
        b = a;
        if (a.dataLabels) {
          c._hasPointLabels = !0;
        }
        if (a.marker) {
          c._hasPointMarkers = !0
        }
      }
      return b
    }, destroy: function () {
      var a = this.series.chart, b = a.hoverPoints, c;
      a.pointCount--;
      if (b && (this.setState(), ga(b, this), !b.length)) {
        a.hoverPoints = null;
      }
      if (this === a.hoverPoint) {
        this.onMouseOut();
      }
      if (this.graphic || this.dataLabel) {
        ba(this), this.destroyElements();
      }
      this.legendItem && a.legend.destroyItem(this);
      for (c in this) {
        this[c] =
            null
      }
    }, destroyElements: function () {
      for (var a = "graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(
          ","), b, c = 6; c--;) {
        b = a[c], this[b]
        && (this[b] = this[b].destroy())
      }
    }, getLabelConfig: function () {
      return {
        x: this.category,
        y: this.y,
        key: this.name || this.category,
        series: this.series,
        point: this,
        percentage: this.percentage,
        total: this.total || this.stackTotal
      }
    }, select: function (a, b) {
      var c = this, d = c.series, e = d.chart, a = o(a, !c.selected);
      c.firePointEvent(a ? "select" : "unselect", {accumulate: b}, function () {
        c.selected =
            c.options.selected = a;
        d.options.data[la(c, d.data)] = c.options;
        c.setState(a && "select");
        b || n(e.getSelectedPoints(), function (a) {
          if (a.selected && a
              !== c) {
            a.selected = a.options.selected = !1, d.options.data[la(a,
                d.data)] = a.options, a.setState(""), a.firePointEvent(
                "unselect")
          }
        })
      })
    }, onMouseOver: function (a) {
      var b = this.series, c = b.chart, d = c.tooltip, e = c.hoverPoint;
      if (e && e !== this) {
        e.onMouseOut();
      }
      this.firePointEvent("mouseOver");
      d && (!d.shared || b.noSharedTooltip) && d.refresh(this, a);
      this.setState("hover");
      c.hoverPoint = this
    },
    onMouseOut: function () {
      var a = this.series.chart, b = a.hoverPoints;
      if (!b || la(this, b) === -1) {
        this.firePointEvent(
            "mouseOut"), this.setState(), a.hoverPoint = null
      }
    }, tooltipFormatter: function (a) {
      var b = this.series, c = b.tooltipOptions, d = o(c.valueDecimals, ""),
          e = c.valuePrefix || "", f = c.valueSuffix || "";
      n(b.pointArrayMap || ["y"], function (b) {
        b = "{point." + b;
        if (e || f) {
          a = a.replace(b + "}", e + b + "}" + f);
        }
        a = a.replace(b + "}", b + ":,." + d + "f}")
      });
      return wa(a, {point: this, series: this.series})
    }, update: function (a, b, c) {
      var d = this, e = d.series, f = d.graphic,
          g, h = e.data, i = e.chart, b = o(b, !0);
      d.firePointEvent("update", {options: a}, function () {
        d.applyOptions(a);
        V(a) && (e.getAttribs(), f && f.attr(d.pointAttr[e.state]));
        g = la(d, h);
        e.xData[g] = d.x;
        e.yData[g] = e.toYData ? e.toYData(d) : d.y;
        e.zData[g] = d.z;
        e.options.data[g] = d.options;
        e.isDirty = !0;
        e.isDirtyData = !0;
        b && i.redraw(c)
      })
    }, remove: function (a, b) {
      var c = this, d = c.series, e = d.chart, f, g = d.data;
      Ia(b, e);
      a = o(a, !0);
      c.firePointEvent("remove", null, function () {
        f = la(c, g);
        g.splice(f, 1);
        d.options.data.splice(f, 1);
        d.xData.splice(f, 1);
        d.yData.splice(f, 1);
        d.zData.splice(f, 1);
        c.destroy();
        d.isDirty = !0;
        d.isDirtyData = !0;
        a && e.redraw()
      })
    }, firePointEvent: function (a, b, c) {
      var d = this, e = this.series.options;
      (e.point.events[a] || d.options && d.options.events
          && d.options.events[a]) && this.importEvents();
      a === "click" && e.allowPointSelect && (c = function (a) {
        d.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
      });
      D(this, a, b, c)
    }, importEvents: function () {
      if (!this.hasImportedEvents) {
        var a = x(this.series.options.point, this.options).events, b;
        this.events = a;
        for (b in a) {
          J(this,
              b, a[b]);
        }
        this.hasImportedEvents = !0
      }
    }, setState: function (a) {
      var b = this.plotX, c = this.plotY, d = this.series, e = d.options.states,
          f = X[d.type].marker && d.options.marker, g = f && !f.enabled,
          h = f && f.states[a], i = h && h.enabled === !1,
          j = d.stateMarkerGraphic, k = this.marker || {}, m = d.chart,
          l = this.pointAttr, a = a || "";
      if (!(a === this.state || this.selected && a !== "select" || e[a]
          && e[a].enabled === !1 || a && (i || g && !h.enabled))) {
        if (this.graphic) {
          e = f && this.graphic.symbolName
              && l[a].r, this.graphic.attr(x(l[a], e ? {
            x: b - e,
            y: c - e,
            width: 2 * e,
            height: 2 * e
          } : {}));
        } else {
          if (a && h) {
            e = h.radius, k = k.symbol || d.symbol, j
            && j.currentSymbol !== k && (j = j.destroy()), j ? j.attr({
              x: b - e,
              y: c - e
            }) : (d.stateMarkerGraphic = j = m.renderer.symbol(k, b - e, c
                - e, 2
                * e, 2 * e).attr(l[a]).add(d.markerGroup), j.currentSymbol = k);
          }
          if (j) {
            j[a && m.isInsidePlot(b, c) ? "show" : "hide"]()
          }
        }
        this.state = a
      }
    }
  };
  var R = function () {
  };
  R.prototype = {
    isCartesian: !0,
    type: "line",
    pointClass: Na,
    sorted: !0,
    requireSorting: !0,
    pointAttrToOptions: {
      stroke: "lineColor",
      "stroke-width": "lineWidth",
      fill: "fillColor",
      r: "radius"
    },
    colorCounter: 0,
    init: function (a, b) {
      var c, d, e = a.series;
      this.chart = a;
      this.options = b = this.setOptions(b);
      this.bindAxes();
      v(this, {
        name: b.name,
        state: "",
        pointAttr: {},
        visible: b.visible !== !1,
        selected: b.selected === !0
      });
      if ($) {
        b.animation = !1;
      }
      d = b.events;
      for (c in d) {
        J(this, c, d[c]);
      }
      if (d && d.click || b.point && b.point.events && b.point.events.click
          || b.allowPointSelect) {
        a.runTrackerClick = !0;
      }
      this.getColor();
      this.getSymbol();
      this.setData(b.data, !1);
      if (this.isCartesian) {
        a.hasCartesianSeries = !0;
      }
      e.push(this);
      this._i = e.length - 1;
      Ib(e, function (a, b) {
        return o(a.options.index,
            a._i) - o(b.options.index, a._i)
      });
      n(e, function (a, b) {
        a.index = b;
        a.name = a.name || "Series " + (b + 1)
      });
      c = b.linkedTo;
      this.linkedSeries = [];
      if (fa(c) && (c = c === ":previous" ? e[this.index - 1] : a.get(
          c))) {
        c.linkedSeries.push(this), this.linkedParent = c
      }
    },
    bindAxes: function () {
      var a = this, b = a.options, c = a.chart, d;
      a.isCartesian && n(["xAxis", "yAxis"], function (e) {
        n(c[e], function (c) {
          d = c.options;
          if (b[e] === d.index || b[e] !== y && b[e] === d.id || b[e] === y
              && d.index === 0) {
            c.series.push(a), a[e] = c, c.isDirty = !0
          }
        });
        a[e] || qa(18, !0)
      })
    },
    autoIncrement: function () {
      var a =
          this.options, b = this.xIncrement, b = o(b, a.pointStart, 0);
      this.pointInterval = o(this.pointInterval, a.pointInterval, 1);
      this.xIncrement = b + this.pointInterval;
      return b
    },
    getSegments: function () {
      var a = -1, b = [], c, d = this.points, e = d.length;
      if (e) {
        if (this.options.connectNulls) {
          for (c = e; c--;) {
            d[c].y === null && d.splice(c, 1);
          }
          d.length && (b = [d])
        } else {
          n(d, function (c, g) {
            c.y === null ? (g > a + 1 && b.push(d.slice(a + 1, g)), a = g) : g
                === e
                - 1 && b.push(d.slice(a + 1, g + 1))
          });
        }
      }
      this.segments = b
    },
    setOptions: function (a) {
      var b = this.chart.options, c = b.plotOptions,
          d = c[this.type];
      this.userOptions = a;
      a = x(d, c.series, a);
      this.tooltipOptions = x(b.tooltip, a.tooltip);
      d.marker === null && delete a.marker;
      return a
    },
    getColor: function () {
      var a = this.options, b = this.userOptions, c = this.chart.options.colors,
          d = this.chart.counters, e;
      e = a.color || X[this.type].color;
      if (!e && !a.colorByPoint) {
        r(b._colorIndex) ? a = b._colorIndex
            : (b._colorIndex = d.color, a = d.color++), e = c[a];
      }
      this.color = e;
      d.wrapColor(c.length)
    },
    getSymbol: function () {
      var a = this.userOptions, b = this.options.marker, c = this.chart,
          d = c.options.symbols,
          c = c.counters;
      this.symbol = b.symbol;
      if (!this.symbol) {
        r(a._symbolIndex) ? a = a._symbolIndex
            : (a._symbolIndex = c.symbol, a = c.symbol++), this.symbol = d[a];
      }
      if (/^url/.test(this.symbol)) {
        b.radius = 0;
      }
      c.wrapSymbol(d.length)
    },
    drawLegendSymbol: function (a) {
      var b = this.options, c = b.marker, d = a.options.symbolWidth,
          e = this.chart.renderer, f = this.legendGroup, a = a.baseline, g;
      if (b.lineWidth) {
        g = {"stroke-width": b.lineWidth};
        if (b.dashStyle) {
          g.dashstyle = b.dashStyle;
        }
        this.legendLine = e.path(["M", 0, a - 4, "L", d, a - 4]).attr(g).add(f)
      }
      if (c && c.enabled) {
        b =
            c.radius, this.legendSymbol = e.symbol(this.symbol, d / 2 - b, a - 4
            - b, 2 * b, 2 * b).add(f)
      }
    },
    addPoint: function (a, b, c, d) {
      var e = this.options, f = this.data, g = this.graph, h = this.area,
          i = this.chart, j = this.xData, k = this.yData, m = this.zData,
          l = this.names, p = g && g.shift || 0, n = e.data;
      Ia(d, i);
      if (g && c) {
        g.shift = p + 1;
      }
      if (h) {
        if (c) {
          h.shift = p + 1;
        }
        h.isArea = !0
      }
      b = o(b, !0);
      d = {series: this};
      this.pointClass.prototype.applyOptions.apply(d, [a]);
      j.push(d.x);
      k.push(this.toYData ? this.toYData(d) : d.y);
      m.push(d.z);
      if (l) {
        l[d.x] = d.name;
      }
      n.push(a);
      e.legendType === "point" &&
      this.generatePoints();
      c && (f[0] && f[0].remove ? f[0].remove(!1)
          : (f.shift(), j.shift(), k.shift(), m.shift(), n.shift()));
      this.getAttribs();
      this.isDirtyData = this.isDirty = !0;
      b && i.redraw()
    },
    setData: function (a, b) {
      var c = this.points, d = this.options, e = this.chart, f = null,
          g = this.xAxis,
          h = g && g.categories && !g.categories.length ? [] : null, i;
      this.xIncrement = null;
      this.pointRange = g && g.categories ? 1 : d.pointRange;
      this.colorCounter = 0;
      var j = [], k = [], m = [], l = a ? a.length : [],
          p = (i = this.pointArrayMap) && i.length, n = !!this.toYData;
      if (l > (d.turboThreshold ||
          1E3)) {
        for (i = 0; f === null && i < l;) {
          f = a[i], i++;
        }
        if (Ea(f)) {
          f = o(d.pointStart, 0);
          d = o(d.pointInterval, 1);
          for (i = 0; i < l; i++) {
            j[i] = f, k[i] = a[i], f += d;
          }
          this.xIncrement = f
        } else if (Da(f)) {
          if (p) {
            for (i = 0; i < l;
                i++) {
              d = a[i], j[i] = d[0], k[i] = d.slice(1, p
                  + 1);
            }
          } else {
            for (i = 0; i < l;
                i++) {
              d = a[i], j[i] = d[0], k[i] = d[1]
            }
          }
        }
      } else {
        for (i = 0; i < l; i++) {
          if (a[i] !== y
              && (d = {series: this}, this.pointClass.prototype.applyOptions.apply(
                  d, [a[i]]), j[i] = d.x, k[i] = n ? this.toYData(d)
                  : d.y, m[i] = d.z, h && d.name)) {
            h[i] = d.name;
          }
        }
      }
      this.requireSorting && j.length > 1 && j[1] < j[0] && qa(15);
      fa(k[0]) &&
      qa(14, !0);
      this.data = [];
      this.options.data = a;
      this.xData = j;
      this.yData = k;
      this.zData = m;
      this.names = h;
      for (i = c && c.length || 0; i--;) {
        c[i] && c[i].destroy && c[i].destroy();
      }
      if (g) {
        g.minRange = g.userMinRange;
      }
      this.isDirty = this.isDirtyData = e.isDirtyBox = !0;
      o(b, !0) && e.redraw(!1)
    },
    remove: function (a, b) {
      var c = this, d = c.chart, a = o(a, !0);
      if (!c.isRemoving) {
        c.isRemoving = !0, D(c, "remove", null, function () {
          c.destroy();
          d.isDirtyLegend = d.isDirtyBox = !0;
          a && d.redraw(b)
        });
      }
      c.isRemoving = !1
    },
    processData: function (a) {
      var b = this.xData, c = this.yData,
          d = b.length, e = 0, f = d, g, h, i = this.xAxis, j = this.options,
          k = j.cropThreshold, m = this.isCartesian;
      if (m && !this.isDirty && !i.isDirty && !this.yAxis.isDirty
          && !a) {
        return !1;
      }
      if (m && this.sorted && (!k || d > k
          || this.forceCrop)) {
        if (a = i.getExtremes(), i = a.min, k = a.max, b[d
        - 1] < i || b[0] > k) {
          b = [], c = [];
        } else if (b[0] < i || b[d - 1] > k) {
          for (a = 0; a < d; a++) {
            if (b[a] >= i) {
              e = q(0, a - 1);
              break
            }
          }
          for (; a < d; a++) {
            if (b[a] > k) {
              f = a + 1;
              break
            }
          }
          b = b.slice(e, f);
          c = c.slice(e, f);
          g = !0
        }
      }
      for (a = b.length - 1; a > 0; a--) {
        if (d = b[a] - b[a - 1], d > 0 && (h
            === y || d < h)) {
          h = d;
        }
      }
      this.cropped = g;
      this.cropStart = e;
      this.processedXData = b;
      this.processedYData = c;
      if (j.pointRange === null) {
        this.pointRange = h || 1;
      }
      this.closestPointRange = h
    },
    generatePoints: function () {
      var a = this.options.data, b = this.data, c, d = this.processedXData,
          e = this.processedYData, f = this.pointClass, g = d.length,
          h = this.cropStart || 0, i, j = this.hasGroupedData, k, m = [], l;
      if (!b && !j) {
        b = [], b.length = a.length, b = this.data = b;
      }
      for (l = 0; l < g; l++) {
        i = h + l, j ? m[l] = (new f).init(this,
            [d[l]].concat(ha(e[l]))) : (b[i] ? k = b[i] : a[i] !== y
            && (b[i] = k = (new f).init(this, a[i], d[l])), m[l] = k);
      }
      if (b && (g !==
          (c = b.length) || j)) {
        for (l = 0; l < c; l++) {
          if (l === h && !j
          && (l += g), b[l]) {
            b[l].destroyElements(), b[l].plotX = y;
          }
        }
      }
      this.data = b;
      this.points = m
    },
    translate: function () {
      this.processedXData || this.processData();
      this.generatePoints();
      var a = this.options, b = a.stacking, c = this.xAxis, d = c.categories,
          e = this.yAxis, f = this.points, g = f.length, h = !!this.modifyValue,
          i, j, k = a.pointPlacement === "between", m = a.threshold;
      j = e.series.sort(function (a, b) {
        return a.index - b.index
      });
      for (a = j.length; a--;) {
        if (j[a].visible) {
          j[a] === this && (i = !0);
          break
        }
      }
      for (a = 0; a <
      g; a++) {
        j = f[a];
        var l = j.x, p = j.y, n = j.low,
            q = e.stacks[(p < m ? "-" : "") + this.stackKey];
        if (e.isLog && p <= 0) {
          j.y = p = null;
        }
        j.plotX = c.translate(l, 0, 0, 0, 1, k);
        if (b && this.visible && q
            && q[l]) {
          n = q[l], q = n.total, n.cum = n = n.cum - p, p = n + p, i
          && (n = o(m, e.min)), e.isLog && n <= 0 && (n = null), b === "percent"
          && (n = q ? n * 100 / q : 0, p = q ? p * 100 / q
              : 0), j.percentage = q
              ? j.y * 100 / q : 0, j.total = j.stackTotal = q, j.stackY = p;
        }
        j.yBottom = r(n) ? e.translate(n, 0, 1, 0, 1) : null;
        h && (p = this.modifyValue(p, j));
        j.plotY = typeof p === "number" && p !== Infinity ? t(e.translate(p, 0,
            1, 0, 1) * 10) / 10 : y;
        j.clientX = k ? c.translate(l, 0, 0, 0, 1) : j.plotX;
        j.negative = j.y < (m || 0);
        j.category = d && d[j.x] !== y ? d[j.x] : j.x
      }
      this.getSegments()
    },
    setTooltipPoints: function (a) {
      var b = [], c, d,
          e = (c = this.xAxis) ? c.tooltipLen || c.len : this.chart.plotSizeX,
          f, g, h = [];
      if (this.options.enableMouseTracking !== !1) {
        if (a) {
          this.tooltipPoints = null;
        }
        n(this.segments || this.points, function (a) {
          b = b.concat(a)
        });
        c && c.reversed && (b = b.reverse());
        a = b.length;
        for (g = 0; g < a; g++) {
          f = b[g];
          c = b[g - 1] ? d + 1 : 0;
          for (d = b[g + 1] ? q(0,
              T((f.clientX + (b[g + 1] ? b[g + 1].clientX : e)) / 2)) : e; c >=
          0 && c <= d;) {
            h[c++] = f
          }
        }
        this.tooltipPoints = h
      }
    },
    tooltipHeaderFormatter: function (a) {
      var b = this.tooltipOptions, c = b.xDateFormat,
          d = b.dateTimeLabelFormats, e = this.xAxis,
          f = e && e.options.type === "datetime", b = b.headerFormat,
          e = e && e.closestPointRange, g;
      if (f && !c) {
        if (e) {
          for (g in E) {
            if (E[g] >= e) {
              c = d[g];
              break
            }
          }
        } else {
          c = d.day;
        }
      }
      f && c && Ea(a.key) && (b = b.replace("{point.key}", "{point.key:" + c
          + "}"));
      return wa(b, {point: a, series: this})
    },
    onMouseOver: function () {
      var a = this.chart, b = a.hoverSeries;
      if (b && b !== this) {
        b.onMouseOut();
      }
      this.options.events.mouseOver &&
      D(this, "mouseOver");
      this.setState("hover");
      a.hoverSeries = this
    },
    onMouseOut: function () {
      var a = this.options, b = this.chart, c = b.tooltip, d = b.hoverPoint;
      if (d) {
        d.onMouseOut();
      }
      this && a.events.mouseOut && D(this, "mouseOut");
      c && !a.stickyTracking && (!c.shared || this.noSharedTooltip) && c.hide();
      this.setState();
      b.hoverSeries = null
    },
    animate: function (a) {
      var b = this, c = b.chart, d = c.renderer, e;
      e = b.options.animation;
      var f = c.clipBox, g = c.inverted, h;
      if (e && !V(e)) {
        e = X[b.type].animation;
      }
      h = "_sharedClip" + e.duration + e.easing;
      if (a) {
        a = c[h],
            e = c[h + "m"], a || (c[h] = a = d.clipRect(v(f, {width: 0})), c[h
        + "m"] = e = d.clipRect(-99, g ? -c.plotLeft : -c.plotTop, 99,
            g ? c.chartWidth : c.chartHeight)), b.group.clip(
            a), b.markerGroup.clip(e), b.sharedClipKey = h;
      } else {
        if (a = c[h]) {
          a.animate({width: c.plotSizeX}, e), c[h + "m"].animate(
              {width: c.plotSizeX + 99}, e);
        }
        b.animate = null;
        b.animationTimeout = setTimeout(function () {
          b.afterAnimate()
        }, e.duration)
      }
    },
    afterAnimate: function () {
      var a = this.chart, b = this.sharedClipKey, c = this.group;
      c && this.options.clip !== !1 && (c.clip(
          a.clipRect), this.markerGroup.clip());
      setTimeout(function () {
        b && a[b] && (a[b] = a[b].destroy(), a[b + "m"] = a[b + "m"].destroy())
      }, 100)
    },
    drawPoints: function () {
      var a, b = this.points, c = this.chart, d, e, f, g, h, i, j, k,
          m = this.options.marker, l, n = this.markerGroup;
      if (m.enabled || this._hasPointMarkers) {
        for (f = b.length;
            f--;) {
          if (g = b[f], d = g.plotX, e = g.plotY, k = g.graphic, i = g.marker
              || {}, a = m.enabled && i.enabled === y
              || i.enabled, l = c.isInsidePlot(t(d), e, c.inverted), a && e
          !== y
          && !isNaN(e) && g.y !== null) {
            if (a = g.pointAttr[g.selected ? "select"
                : ""], h = a.r, i = o(i.symbol, this.symbol), j = i.indexOf(
                "url")
                ===
                0, k) {
              k.attr(
                  {
                    visibility: l ? Z ? "inherit" : "visible" : "hidden"
                  }).animate(v({
                x: d - h,
                y: e - h
              }, k.symbolName ? {width: 2 * h, height: 2 * h} : {}));
            } else {
              if (l && (h > 0 || j)) {
                g.graphic = c.renderer.symbol(i, d - h, e
                    - h, 2 * h, 2 * h).attr(a).add(n)
              }
            }
          } else if (k) {
            g.graphic = k.destroy()
          }
        }
      }
    },
    convertAttribs: function (a, b, c, d) {
      var e = this.pointAttrToOptions, f, g, h = {}, a = a || {}, b = b || {},
          c = c || {}, d = d || {};
      for (f in e) {
        g = e[f], h[f] = o(a[g], b[f], c[f], d[f]);
      }
      return h
    },
    getAttribs: function () {
      var a = this, b = a.options, c = X[a.type].marker ? b.marker : b,
          d = c.states, e = d.hover, f, g = a.color,
          h = {stroke: g, fill: g}, i = a.points || [], j = [], k,
          m = a.pointAttrToOptions, l = b.negativeColor, p;
      b.marker ? (e.radius = e.radius || c.radius + 2, e.lineWidth = e.lineWidth
          || c.lineWidth + 1) : e.color = e.color || ma(e.color || g).brighten(
          e.brightness).get();
      j[""] = a.convertAttribs(c, h);
      n(["hover", "select"], function (b) {
        j[b] = a.convertAttribs(d[b], j[""])
      });
      a.pointAttr = j;
      for (g = i.length; g--;) {
        h = i[g];
        if ((c = h.options && h.options.marker || h.options) && c.enabled
            === !1) {
          c.radius = 0;
        }
        if (h.negative && l) {
          h.color = h.fillColor = l;
        }
        f = b.colorByPoint || h.color;
        if (h.options) {
          for (p in m) {
            r(c[m[p]]) && (f = !0);
          }
        }
        if (f) {
          c = c || {};
          k = [];
          d = c.states || {};
          f = d.hover = d.hover || {};
          if (!b.marker) {
            f.color = ma(f.color || h.color).brighten(f.brightness
                || e.brightness).get();
          }
          k[""] = a.convertAttribs(v({color: h.color}, c), j[""]);
          k.hover = a.convertAttribs(d.hover, j.hover, k[""]);
          k.select = a.convertAttribs(d.select, j.select, k[""]);
          if (h.negative && b.marker
              && l) {
            k[""].fill = k.hover.fill = k.select.fill = a.convertAttribs(
                {fillColor: l}).fill
          }
        } else {
          k = j;
        }
        h.pointAttr = k
      }
    },
    update: function (a, b) {
      var c = this.chart, d =
          this.type, a = x(this.userOptions,
          {animation: !1, index: this.index, pointStart: this.xData[0]}, a);
      this.remove(!1);
      v(this, aa[a.type || d].prototype);
      this.init(c, a);
      o(b, !0) && c.redraw(!1)
    },
    destroy: function () {
      var a = this, b = a.chart, c = /AppleWebKit\/533/.test(Aa), d, e,
          f = a.data || [], g, h, i;
      D(a, "destroy");
      ba(a);
      n(["xAxis", "yAxis"], function (b) {
        if (i = a[b]) {
          ga(i.series, a), i.isDirty = i.forceRedraw = !0
        }
      });
      a.legendItem && a.chart.legend.destroyItem(a);
      for (e = f.length; e--;) {
        (g = f[e]) && g.destroy && g.destroy();
      }
      a.points = null;
      clearTimeout(a.animationTimeout);
      n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(
          ","), function (b) {
        a[b] && (d = c && b === "group" ? "hide" : "destroy", a[b][d]())
      });
      if (b.hoverSeries === a) {
        b.hoverSeries = null;
      }
      ga(b.series, a);
      for (h in a) {
        delete a[h]
      }
    },
    drawDataLabels: function () {
      var a = this, b = a.options.dataLabels, c = a.points, d, e, f, g;
      if (b.enabled || a._hasPointLabels) {
        a.dlProcessOptions
        && a.dlProcessOptions(b), g = a.plotGroup("dataLabelsGroup",
            "data-labels", a.visible ? "visible" : "hidden", b.zIndex
            || 6), e = b, n(c, function (c) {
          var i,
              j = c.dataLabel, k, m, l = c.connector, n = !0;
          d = c.options && c.options.dataLabels;
          i = e.enabled || d && d.enabled;
          if (j && !i) {
            c.dataLabel = j.destroy();
          } else if (i) {
            i = b.rotation;
            b = x(e, d);
            k = c.getLabelConfig();
            f = b.format ? wa(b.format, k) : b.formatter.call(k, b);
            b.style.color = o(b.color, b.style.color, a.color, "black");
            if (j) {
              if (r(f)) {
                j.attr({text: f}), n = !1;
              } else {
                if (c.dataLabel = j = j.destroy(), l) {
                  c.connector = l.destroy()
                }
              }
            } else if (r(f)) {
              j = {
                fill: b.backgroundColor,
                stroke: b.borderColor,
                "stroke-width": b.borderWidth,
                r: b.borderRadius || 0,
                rotation: i,
                padding: b.padding,
                zIndex: 1
              };
              for (m in j) {
                j[m] === y && delete j[m];
              }
              j = c.dataLabel = a.chart.renderer[i ? "text" : "label"](f, 0,
                  -999,
                  null, null, null, b.useHTML).attr(j).css(b.style).add(
                  g).shadow(
                  b.shadow)
            }
            j && a.alignDataLabel(c, j, b, null, n)
          }
        })
      }
    },
    alignDataLabel: function (a, b, c, d, e) {
      var f = this.chart, g = f.inverted, h = o(a.plotX, -999),
          a = o(a.plotY, -999), i = b.getBBox(), d = v({
            x: g ? f.plotWidth - a : h,
            y: t(g ? f.plotHeight - h : a),
            width: 0,
            height: 0
          }, d);
      v(c, {width: i.width, height: i.height});
      c.rotation ? (d = {
        align: c.align, x: d.x + c.x + d.width / 2, y: d.y +
        c.y + d.height / 2
      }, b[e ? "attr" : "animate"](d)) : b.align(c, null, d);
      b.attr({
        visibility: c.crop === !1 || f.isInsidePlot(h, a, g) ? f.renderer.isSVG
            ? "inherit" : "visible" : "hidden"
      })
    },
    getSegmentPath: function (a) {
      var b = this, c = [], d = b.options.step;
      n(a, function (e, f) {
        var g = e.plotX, h = e.plotY, i;
        b.getPointSpline ? c.push.apply(c, b.getPointSpline(a, e, f)) : (c.push(
            f ? "L" : "M"), d && f && (i = a[f - 1], d === "right" ? c.push(
            i.plotX, h) : d === "center" ? c.push((i.plotX + g) / 2,
            i.plotY, (i.plotX + g) / 2, h) : c.push(g, i.plotY)), c.push(
            e.plotX, e.plotY))
      });
      return c
    },
    getGraphPath: function () {
      var a = this, b = [], c, d = [];
      n(a.segments, function (e) {
        c = a.getSegmentPath(e);
        e.length > 1 ? b = b.concat(c) : d.push(e[0])
      });
      a.singlePoints = d;
      return a.graphPath = b
    },
    drawGraph: function () {
      var a = this, b = this.options, c = [
            ["graph", b.lineColor || this.color]
          ], d = b.lineWidth, e = b.dashStyle, f = this.getGraphPath(),
          g = b.negativeColor;
      g && c.push(["graphNeg", g]);
      n(c, function (c, g) {
        var j = c[0], k = a[j];
        if (k) {
          Ta(k), k.animate({d: f});
        } else if (d && f.length) {
          k = {stroke: c[1], "stroke-width": d, zIndex: 1};
          if (e) {
            k.dashstyle = e;
          }
          a[j] =
              a.chart.renderer.path(f).attr(k).add(a.group).shadow(!g
                  && b.shadow)
        }
      })
    },
    clipNeg: function () {
      var a = this.options, b = this.chart, c = b.renderer, d = a.negativeColor,
          e, f = this.graph, g = this.area, h = this.posClip, i = this.negClip;
      e = b.chartWidth;
      var j = b.chartHeight, k = q(e, j);
      if (d && (f || g)) {
        d = ja(this.yAxis.len
            - this.yAxis.translate(a.threshold || 0)), a = {
          x: 0,
          y: 0,
          width: k,
          height: d
        }, k = {x: 0, y: d, width: k, height: k - d}, b.inverted && c.isVML
        && (a = {
          x: b.plotWidth - d - b.plotLeft,
          y: 0,
          width: e,
          height: j
        }, k = {
          x: d + b.plotLeft - e, y: 0, width: b.plotLeft + d,
          height: e
        }), this.yAxis.reversed ? (b = k, e = a) : (b = a, e = k), h
            ? (h.animate(
                b), i.animate(e)) : (this.posClip = h = c.clipRect(
                b), this.negClip = i = c.clipRect(e), f && (f.clip(
                h), this.graphNeg.clip(i)), g && (g.clip(h), this.areaNeg.clip(
                i)))
      }
    },
    invertGroups: function () {
      function a() {
        var a = {width: b.yAxis.len, height: b.xAxis.len};
        n(["group", "markerGroup"], function (c) {
          b[c] && b[c].attr(a).invert()
        })
      }

      var b = this, c = b.chart;
      if (b.xAxis) {
        J(c, "resize", a), J(b, "destroy", function () {
          ba(c, "resize", a)
        }), a(), b.invertGroups = a
      }
    },
    plotGroup: function (a, b, c, d, e) {
      var f = this[a], g = !f, h = this.chart, i = this.xAxis, j = this.yAxis;
      g && (this[a] = f = h.renderer.g(b).attr(
          {visibility: c, zIndex: d || 0.1}).add(e));
      f[g ? "attr" : "animate"]({
        translateX: i ? i.left : h.plotLeft,
        translateY: j ? j.top : h.plotTop,
        scaleX: 1,
        scaleY: 1
      });
      return f
    },
    render: function () {
      var a = this.chart, b, c = this.options,
          d = c.animation && !!this.animate && a.renderer.isSVG,
          e = this.visible ? "visible" : "hidden", f = c.zIndex,
          g = this.hasRendered, h = a.seriesGroup;
      b = this.plotGroup("group", "series", e, f, h);
      this.markerGroup = this.plotGroup("markerGroup",
          "markers", e, f, h);
      d && this.animate(!0);
      this.getAttribs();
      b.inverted = this.isCartesian ? a.inverted : !1;
      this.drawGraph && (this.drawGraph(), this.clipNeg());
      this.drawDataLabels();
      this.drawPoints();
      this.options.enableMouseTracking !== !1 && this.drawTracker();
      a.inverted && this.invertGroups();
      c.clip !== !1 && !this.sharedClipKey && !g && b.clip(a.clipRect);
      d ? this.animate() : g || this.afterAnimate();
      this.isDirty = this.isDirtyData = !1;
      this.hasRendered = !0
    },
    redraw: function () {
      var a = this.chart, b = this.isDirtyData, c = this.group, d = this.xAxis,
          e = this.yAxis;
      c && (a.inverted && c.attr(
          {width: a.plotWidth, height: a.plotHeight}), c.animate({
        translateX: o(d && d.left, a.plotLeft),
        translateY: o(e && e.top, a.plotTop)
      }));
      this.translate();
      this.setTooltipPoints(!0);
      this.render();
      b && D(this, "updatedData")
    },
    setState: function (a) {
      var b = this.options, c = this.graph, d = this.graphNeg, e = b.states,
          b = b.lineWidth, a = a || "";
      if (this.state !== a) {
        this.state = a, e[a] && e[a].enabled === !1 || (a
        && (b = e[a].lineWidth || b + 1), c && !c.dashstyle
        && (a = {"stroke-width": b}, c.attr(a), d && d.attr(a)))
      }
    },
    setVisible: function (a, b) {
      var c = this, d = c.chart, e = c.legendItem, f,
          g = d.options.chart.ignoreHiddenSeries, h = c.visible;
      f = (c.visible = a = c.userOptions.visible = a === y ? !h : a) ? "show"
          : "hide";
      n(["group", "dataLabelsGroup", "markerGroup", "tracker"], function (a) {
        if (c[a]) {
          c[a][f]()
        }
      });
      if (d.hoverSeries === c) {
        c.onMouseOut();
      }
      e && d.legend.colorizeItem(c, a);
      c.isDirty = !0;
      c.options.stacking && n(d.series, function (a) {
        if (a.options.stacking && a.visible) {
          a.isDirty = !0
        }
      });
      n(c.linkedSeries, function (b) {
        b.setVisible(a, !1)
      });
      if (g) {
        d.isDirtyBox = !0;
      }
      b !== !1 && d.redraw();
      D(c,
          f)
    },
    show: function () {
      this.setVisible(!0)
    },
    hide: function () {
      this.setVisible(!1)
    },
    select: function (a) {
      this.selected = a = a === y ? !this.selected : a;
      if (this.checkbox) {
        this.checkbox.checked = a;
      }
      D(this, a ? "select" : "unselect")
    },
    drawTracker: function () {
      var a = this, b = a.options, c = b.trackByArea,
          d = [].concat(c ? a.areaPath : a.graphPath), e = d.length,
          f = a.chart, g = f.pointer, h = f.renderer,
          i = f.options.tooltip.snap, j = a.tracker, k = b.cursor,
          k = k && {cursor: k}, m = a.singlePoints, l, n = function () {
            if (f.hoverSeries !== a) {
              a.onMouseOver()
            }
          };
      if (e && !c) {
        for (l =
            e + 1; l--;) {
          d[l] === "M" && d.splice(l + 1, 0, d[l + 1] - i,
              d[l + 2], "L"), (l && d[l] === "M" || l === e) && d.splice(l, 0,
              "L", d[l - 2] + i, d[l - 1]);
        }
      }
      for (l = 0; l < m.length; l++) {
        e = m[l], d.push("M", e.plotX - i, e.plotY,
            "L", e.plotX + i, e.plotY);
      }
      if (j) {
        j.attr({d: d});
      } else if (a.tracker = j = h.path(d).attr({
        "class": "highcharts-tracker",
        "stroke-linejoin": "round",
        visibility: a.visible ? "visible" : "hidden",
        stroke: Ob,
        fill: c ? Ob : S,
        "stroke-width": b.lineWidth + (c ? 0 : 2 * i),
        zIndex: 2
      }).addClass("highcharts-tracker").on("mouseover", n).on("mouseout",
          function (a) {
            g.onTrackerMouseOut(a)
          }).css(k).add(a.markerGroup),
          fb) {
        j.on("touchstart", n)
      }
    }
  };
  M = ea(R);
  aa.line = M;
  X.area = x(W, {threshold: 0});
  M = ea(R, {
    type: "area", getSegments: function () {
      var a = [], b = [], c = [], d = this.xAxis, e = this.yAxis,
          f = e.stacks[this.stackKey], g = {}, h, i, j = this.points, k, m;
      if (this.options.stacking && !this.cropped) {
        for (k = 0; k < j.length; k++) {
          g[j[k].x] = j[k];
        }
        for (m in f) {
          c.push(+m);
        }
        c.sort(function (a, b) {
          return a - b
        });
        n(c, function (a) {
          g[a] ? b.push(g[a]) : (h = d.translate(a), i = e.toPixels(f[a].cum,
              !0), b.push({
            y: null,
            plotX: h,
            clientX: h,
            plotY: i,
            yBottom: i,
            onMouseOver: ta
          }))
        });
        b.length &&
        a.push(b)
      } else {
        R.prototype.getSegments.call(this), a = this.segments;
      }
      this.segments = a
    }, getSegmentPath: function (a) {
      var b = R.prototype.getSegmentPath.call(this, a), c = [].concat(b), d,
          e = this.options;
      b.length === 3 && c.push("L", b[1], b[2]);
      if (e.stacking && !this.closedStacks) {
        for (d = a.length - 1; d >= 0;
            d--) {
          d < a.length - 1 && e.step && c.push(a[d + 1].plotX,
              a[d].yBottom), c.push(a[d].plotX,
              a[d].yBottom);
        }
      } else {
        this.closeSegment(c, a);
      }
      this.areaPath = this.areaPath.concat(c);
      return b
    }, closeSegment: function (a, b) {
      var c = this.yAxis.getThreshold(this.options.threshold);
      a.push("L", b[b.length - 1].plotX, c, "L", b[0].plotX, c)
    }, drawGraph: function () {
      this.areaPath = [];
      R.prototype.drawGraph.apply(this);
      var a = this, b = this.areaPath, c = this.options, d = [
        ["area", this.color, c.fillColor]
      ];
      c.negativeColor && d.push(
          ["areaNeg", c.negativeColor, c.negativeFillColor]);
      n(d, function (d) {
        var f = d[0], g = a[f];
        g ? g.animate({d: b}) : a[f] = a.chart.renderer.path(b).attr({
          fill: o(d[2], ma(d[1]).setOpacity(c.fillOpacity || 0.75).get()),
          zIndex: 0
        }).add(a.group)
      })
    }, drawLegendSymbol: function (a, b) {
      b.legendSymbol = this.chart.renderer.rect(0,
          a.baseline - 11, a.options.symbolWidth, 12, 2).attr({zIndex: 3}).add(
          b.legendGroup)
    }
  });
  aa.area = M;
  X.spline = x(W);
  F = ea(R, {
    type: "spline", getPointSpline: function (a, b, c) {
      var d = b.plotX, e = b.plotY, f = a[c - 1], g = a[c + 1], h, i, j, k;
      if (f && g) {
        a = f.plotY;
        j = g.plotX;
        var g = g.plotY, m;
        h = (1.5 * d + f.plotX) / 2.5;
        i = (1.5 * e + a) / 2.5;
        j = (1.5 * d + j) / 2.5;
        k = (1.5 * e + g) / 2.5;
        m = (k - i) * (j - d) / (j - h) + e - k;
        i += m;
        k += m;
        i > a && i > e ? (i = q(a, e), k = 2 * e - i) : i < a && i < e
            && (i = K(a, e), k = 2 * e - i);
        k > g && k > e ? (k = q(g, e), i = 2 * e - k) : k < g && k < e
            && (k = K(g, e), i = 2 * e - k);
        b.rightContX = j;
        b.rightContY = k
      }
      c ?
          (b = ["C", f.rightContX || f.plotX, f.rightContY || f.plotY, h || d,
            i || e, d, e], f.rightContX = f.rightContY = null) : b = ["M", d,
            e];
      return b
    }
  });
  aa.spline = F;
  X.areaspline = x(X.area);
  na = M.prototype;
  F = ea(F, {
    type: "areaspline",
    closedStacks: !0,
    getSegmentPath: na.getSegmentPath,
    closeSegment: na.closeSegment,
    drawGraph: na.drawGraph
  });
  aa.areaspline = F;
  X.column = x(W, {
    borderColor: "#FFFFFF",
    borderWidth: 1,
    borderRadius: 0,
    groupPadding: 0.2,
    marker: null,
    pointPadding: 0.1,
    minPointLength: 0,
    cropThreshold: 50,
    pointRange: null,
    states: {
      hover: {
        brightness: 0.1,
        shadow: !1
      }, select: {color: "#C0C0C0", borderColor: "#000000", shadow: !1}
    },
    dataLabels: {align: null, verticalAlign: null, y: null},
    stickyTracking: !1,
    threshold: 0
  });
  F = ea(R, {
    type: "column",
    tooltipOutsidePlot: !0,
    requireSorting: !1,
    pointAttrToOptions: {
      stroke: "borderColor",
      "stroke-width": "borderWidth",
      fill: "color",
      r: "borderRadius"
    },
    trackerGroups: ["group", "dataLabelsGroup"],
    init: function () {
      R.prototype.init.apply(this, arguments);
      var a = this, b = a.chart;
      b.hasRendered && n(b.series, function (b) {
        if (b.type === a.type) {
          b.isDirty = !0
        }
      })
    },
    getColumnMetrics: function () {
      var a = this, b = a.chart, c = a.options, d = this.xAxis, e = d.reversed,
          f, g = {}, h, i = 0;
      c.grouping === !1 ? i = 1 : n(b.series, function (b) {
        var c = b.options;
        if (b.type === a.type && b.visible && a.options.group
            === c.group) {
          c.stacking ? (f = b.stackKey, g[f] === y
          && (g[f] = i++), h = g[f]) : c.grouping !== !1
              && (h = i++), b.columnIndex = h
        }
      });
      var b = K(Q(d.transA) * (d.ordinalSlope || c.pointRange
          || d.closestPointRange || 1), d.len), d = b * c.groupPadding,
          j = (b - 2 * d) / i, k = c.pointWidth,
          c = r(k) ? (j - k) / 2 : j * c.pointPadding, k = o(k, j - 2 * c);
      return a.columnMetrics =
          {
            width: k,
            offset: c + (d + ((e ? i - (a.columnIndex || 0) : a.columnIndex)
                || 0) * j - b / 2) * (e ? -1 : 1)
          }
    },
    translate: function () {
      var a = this, b = a.chart, c = a.options, d = c.stacking,
          e = c.borderWidth, f = a.yAxis,
          g = a.translatedThreshold = f.getThreshold(c.threshold),
          h = o(c.minPointLength, 5), c = a.getColumnMetrics(), i = c.width,
          j = ja(q(i, 1 + 2 * e)), k = c.offset;
      R.prototype.translate.apply(a);
      n(a.points, function (c) {
        var l = K(q(-999, c.plotY), f.len + 999), n = o(c.yBottom, g),
            s = c.plotX + k, t = ja(K(l, n)), l = ja(q(l, n) - t),
            r = f.stacks[(c.y < 0 ? "-" : "") + a.stackKey];
        d && a.visible &&
        r && r[c.x] && r[c.x].setOffset(k, j);
        Q(l) < h && h && (l = h, t = Q(t - g) > h ? n - h : g - (f.translate(
            c.y, 0, 1, 0, 1) <= g ? h : 0));
        c.barX = s;
        c.pointWidth = i;
        c.shapeType = "rect";
        c.shapeArgs = c = b.renderer.Element.prototype.crisp.call(0, e, s, t, j,
            l);
        e % 2 && (c.y -= 1, c.height += 1)
      })
    },
    getSymbol: ta,
    drawLegendSymbol: M.prototype.drawLegendSymbol,
    drawGraph: ta,
    drawPoints: function () {
      var a = this, b = a.options, c = a.chart.renderer, d;
      n(a.points, function (e) {
        var f = e.plotY, g = e.graphic;
        if (f !== y && !isNaN(f) && e.y !== null) {
          d = e.shapeArgs, g ? (Ta(
              g), g.animate(x(d))) : e.graphic =
              c[e.shapeType](d).attr(
                  e.pointAttr[e.selected ? "select" : ""]).add(
                  a.group).shadow(b.shadow, null, b.stacking
                  && !b.borderRadius);
        } else if (g) {
          e.graphic = g.destroy()
        }
      })
    },
    drawTracker: function () {
      var a = this, b = a.chart.pointer, c = a.options.cursor,
          d = c && {cursor: c}, e = function (b) {
            var c = b.target, d;
            for (a.onMouseOver(); c && !d;) {
              d = c.point, c = c.parentNode;
            }
            if (d !== y) {
              d.onMouseOver(b)
            }
          };
      n(a.points, function (a) {
        if (a.graphic) {
          a.graphic.element.point = a;
        }
        if (a.dataLabel) {
          a.dataLabel.element.point = a
        }
      });
      a._hasTracking ? a._hasTracking = !0 : n(a.trackerGroups,
          function (c) {
            if (a[c] && (a[c].addClass("highcharts-tracker").on("mouseover",
                e).on("mouseout", function (a) {
              b.onTrackerMouseOut(a)
            }).css(d), fb)) {
              a[c].on("touchstart", e)
            }
          })
    },
    alignDataLabel: function (a, b, c, d, e) {
      var f = this.chart, g = f.inverted, h = a.dlBox || a.shapeArgs,
          i = a.below || a.plotY > o(this.translatedThreshold, f.plotSizeY),
          j = o(c.inside, !!this.options.stacking);
      if (h && (d = x(h), g && (d = {
        x: f.plotWidth - d.y - d.height,
        y: f.plotHeight - d.x - d.width,
        width: d.height,
        height: d.width
      }), !j)) {
        g ? (d.x += i ? 0 : d.width, d.width = 0) : (d.y += i ? d.height
            :
            0, d.height = 0);
      }
      c.align = o(c.align, !g || j ? "center" : i ? "right" : "left");
      c.verticalAlign = o(c.verticalAlign,
          g || j ? "middle" : i ? "top" : "bottom");
      R.prototype.alignDataLabel.call(this, a, b, c, d, e)
    },
    animate: function (a) {
      var b = this.yAxis, c = this.options, d = this.chart.inverted, e = {};
      if (Z) {
        a ? (e.scaleY = 0.001, a = K(b.pos + b.len,
            q(b.pos, b.toPixels(c.threshold))), d ? e.translateX = a - b.len
            : e.translateY = a, this.group.attr(e)) : (e.scaleY = 1, e[d
            ? "translateX" : "translateY"] = b.pos, this.group.animate(e,
            this.options.animation), this.animate = null)
      }
    },
    remove: function () {
      var a = this, b = a.chart;
      b.hasRendered && n(b.series, function (b) {
        if (b.type === a.type) {
          b.isDirty = !0
        }
      });
      R.prototype.remove.apply(a, arguments)
    }
  });
  aa.column = F;
  X.bar = x(X.column);
  na = ea(F, {type: "bar", inverted: !0});
  aa.bar = na;
  X.scatter = x(W, {
    lineWidth: 0,
    tooltip: {
      headerFormat: '<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
      pointFormat: "x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",
      followPointer: !0
    },
    stickyTracking: !1
  });
  na = ea(R, {
    type: "scatter",
    sorted: !1,
    requireSorting: !1,
    noSharedTooltip: !0,
    trackerGroups: ["markerGroup"],
    drawTracker: F.prototype.drawTracker,
    setTooltipPoints: ta
  });
  aa.scatter = na;
  X.pie = x(W, {
    borderColor: "#FFFFFF",
    borderWidth: 1,
    center: [null, null],
    clip: !1,
    colorByPoint: !0,
    dataLabels: {
      distance: 30, enabled: !0, formatter: function () {
        return this.point.name
      }
    },
    ignoreHiddenPoint: !0,
    legendType: "point",
    marker: null,
    size: null,
    showInLegend: !1,
    slicedOffset: 10,
    states: {hover: {brightness: 0.1, shadow: !1}},
    stickyTracking: !1,
    tooltip: {followPointer: !0}
  });
  W = {
    type: "pie",
    isCartesian: !1,
    pointClass: ea(Na, {
      init: function () {
        Na.prototype.init.apply(this, arguments);
        var a = this, b;
        if (a.y < 0) {
          a.y = null;
        }
        v(a, {visible: a.visible !== !1, name: o(a.name, "Slice")});
        b = function () {
          a.slice()
        };
        J(a, "select", b);
        J(a, "unselect", b);
        return a
      }, setVisible: function (a) {
        var b = this, c = b.series, d = c.chart, e;
        b.visible = b.options.visible = a = a === y ? !b.visible : a;
        c.options.data[la(b, c.data)] = b.options;
        e = a ? "show" : "hide";
        n(["graphic", "dataLabel", "connector", "shadowGroup"], function (a) {
          if (b[a]) {
            b[a][e]()
          }
        });
        b.legendItem && d.legend.colorizeItem(b,
            a);
        if (!c.isDirty
            && c.options.ignoreHiddenPoint) {
          c.isDirty = !0, d.redraw()
        }
      }, slice: function (a, b, c) {
        var d = this.series;
        Ia(c, d.chart);
        o(b, !0);
        this.sliced = this.options.sliced = a = r(a) ? a : !this.sliced;
        d.options.data[la(this, d.data)] = this.options;
        a = a ? this.slicedTranslation : {translateX: 0, translateY: 0};
        this.graphic.animate(a);
        this.shadowGroup && this.shadowGroup.animate(a)
      }
    }),
    requireSorting: !1,
    noSharedTooltip: !0,
    trackerGroups: ["group", "dataLabelsGroup"],
    pointAttrToOptions: {
      stroke: "borderColor", "stroke-width": "borderWidth",
      fill: "color"
    },
    getColor: ta,
    animate: function (a) {
      var b = this, c = b.points, d = b.startAngleRad;
      if (!a) {
        n(c, function (a) {
          var c = a.graphic, a = a.shapeArgs;
          c && (c.attr({r: b.center[3] / 2, start: d, end: d}), c.animate(
              {r: a.r, start: a.start, end: a.end}, b.options.animation))
        }), b.animate = null
      }
    },
    setData: function (a, b) {
      R.prototype.setData.call(this, a, !1);
      this.processData();
      this.generatePoints();
      o(b, !0) && this.chart.redraw()
    },
    getCenter: function () {
      var a = this.options, b = this.chart, c = 2 * (a.slicedOffset || 0), d,
          e = b.plotWidth - 2 * c, f = b.plotHeight -
          2 * c, b = a.center,
          a = [o(b[0], "50%"), o(b[1], "50%"), a.size || "100%",
            a.innerSize || 0], g = K(e, f), h;
      return La(a, function (a, b) {
        h = /%$/.test(a);
        d = b < 2 || b === 2 && h;
        return (h ? [e, f, g, g][b] * u(a) / 100 : a) + (d ? c : 0)
      })
    },
    translate: function (a) {
      this.generatePoints();
      var b = 0, c = 0, d = this.options, e = d.slicedOffset,
          f = e + d.borderWidth, g, h, i,
          j = this.startAngleRad = Ka / 180 * ((d.startAngle || 0) % 360 - 90),
          k = this.points, m = 2 * Ka, l = d.dataLabels.distance,
          n = d.ignoreHiddenPoint, o, q = k.length, r;
      if (!a) {
        this.center = a = this.getCenter();
      }
      this.getX = function (b, c) {
        i =
            I.asin((b - a[1]) / (a[2] / 2 + l));
        return a[0] + (c ? -1 : 1) * Y(i) * (a[2] / 2 + l)
      };
      for (o = 0; o < q; o++) {
        r = k[o], b += n && !r.visible ? 0 : r.y;
      }
      for (o = 0; o < q; o++) {
        r = k[o];
        d = b ? r.y / b : 0;
        g = t((j + c * m) * 1E3) / 1E3;
        if (!n || r.visible) {
          c += d;
        }
        h = t((j + c * m) * 1E3) / 1E3;
        r.shapeType = "arc";
        r.shapeArgs = {
          x: a[0],
          y: a[1],
          r: a[2] / 2,
          innerR: a[3] / 2,
          start: g,
          end: h
        };
        i = (h + g) / 2;
        i > 0.75 * m && (i -= 2 * Ka);
        r.slicedTranslation = {
          translateX: t(Y(i) * e),
          translateY: t(ca(i) * e)
        };
        g = Y(i) * a[2] / 2;
        h = ca(i) * a[2] / 2;
        r.tooltipPos = [a[0] + g * 0.7, a[1] + h * 0.7];
        r.half = i < m / 4 ? 0 : 1;
        r.angle = i;
        f = K(f, l / 2);
        r.labelPos =
            [a[0] + g + Y(i) * l, a[1] + h + ca(i) * l, a[0] + g + Y(i) * f,
              a[1] + h + ca(i) * f, a[0] + g, a[1] + h,
              l < 0 ? "center" : r.half ? "right" : "left", i];
        r.percentage = d * 100;
        r.total = b
      }
      this.setTooltipPoints()
    },
    drawGraph: null,
    drawPoints: function () {
      var a = this, b = a.chart.renderer, c, d, e = a.options.shadow, f, g;
      if (e && !a.shadowGroup) {
        a.shadowGroup = b.g("shadow").add(a.group);
      }
      n(a.points, function (h) {
        d = h.graphic;
        g = h.shapeArgs;
        f = h.shadowGroup;
        if (e && !f) {
          f = h.shadowGroup = b.g("shadow").add(a.shadowGroup);
        }
        c = h.sliced ? h.slicedTranslation : {translateX: 0, translateY: 0};
        f && f.attr(c);
        d ? d.animate(v(g, c)) : h.graphic = d = b.arc(g).setRadialReference(
            a.center).attr(h.pointAttr[h.selected ? "select" : ""]).attr(
            {"stroke-linejoin": "round"}).attr(c).add(a.group).shadow(e, f);
        h.visible === !1 && h.setVisible(!1)
      })
    },
    drawDataLabels: function () {
      var a = this, b = a.data, c, d = a.chart, e = a.options.dataLabels,
          f = o(e.connectorPadding, 10), g = o(e.connectorWidth, 1),
          h = d.plotWidth, d = d.plotHeight, i, j, k = o(e.softConnector, !0),
          m = e.distance, l = a.center, p = l[2] / 2, s = l[1], r = m > 0, v, w,
          u, x, y = [
            [],
            []
          ], A, z, E, H, C, D = [0, 0, 0, 0],
          K = function (a, b) {
            return b.y - a.y
          }, M = function (a, b) {
            a.sort(function (a, c) {
              return a.angle !== void 0 && (c.angle - a.angle) * b
            })
          };
      if (e.enabled || a._hasPointLabels) {
        R.prototype.drawDataLabels.apply(a);
        n(b, function (a) {
          a.dataLabel && y[a.half].push(a)
        });
        for (H = 0; !x && b[H];) {
          x = b[H] && b[H].dataLabel
              && (b[H].dataLabel.getBBox().height || 21), H++;
        }
        for (H = 2; H--;) {
          var b = [], L = [], I = y[H], J = I.length, F;
          M(I, H - 0.5);
          if (m > 0) {
            for (C = s - p - m; C <= s + p + m; C += x) {
              b.push(C);
            }
            w = b.length;
            if (J > w) {
              c = [].concat(I);
              c.sort(K);
              for (C = J; C--;) {
                c[C].rank = C;
              }
              for (C = J; C--;) {
                I[C].rank >=
                w && I.splice(C, 1);
              }
              J = I.length
            }
            for (C = 0; C < J; C++) {
              c = I[C];
              u = c.labelPos;
              c = 9999;
              var O, N;
              for (N = 0; N < w; N++) {
                O = Q(b[N] - u[1]), O < c
                && (c = O, F = N);
              }
              if (F < C && b[C] !== null) {
                F = C;
              } else {
                for (w < J - C + F && b[C]
                !== null && (F = w - J + C); b[F] === null;) {
                  F++;
                }
              }
              L.push({i: F, y: b[F]});
              b[F] = null
            }
            L.sort(K)
          }
          for (C = 0; C < J; C++) {
            c = I[C];
            u = c.labelPos;
            v = c.dataLabel;
            E = c.visible === !1 ? "hidden" : "visible";
            c = u[1];
            if (m > 0) {
              if (w = L.pop(), F = w.i, z = w.y, c > z && b[F + 1] !== null || c
              < z && b[F - 1] !== null) {
                z = c
              }
            } else {
              z = c;
            }
            A = e.justify ? l[0] + (H ? -1 : 1) * (p + m) : a.getX(
                F === 0 || F === b.length - 1 ? c : z, H);
            v._attr =
                {visibility: E, align: u[6]};
            v._pos = {
              x: A + e.x + ({left: f, right: -f}[u[6]] || 0),
              y: z + e.y - 10
            };
            v.connX = A;
            v.connY = z;
            if (this.options.size === null) {
              w = v.width, A - w < f ? D[3] = q(
                  t(w - A + f), D[3]) : A + w > h - f && (D[1] = q(
                  t(A + w - h + f), D[1])), z - x / 2 < 0 ? D[0] = q(
                  t(-z + x / 2), D[0]) : z + x / 2 > d && (D[2] = q(
                  t(z + x / 2 - d), D[2]))
            }
          }
        }
        if (pa(D) === 0 || this.verifyDataLabelOverflow(
            D)) {
          this.placeDataLabels(), r && g && n(this.points, function (b) {
            i = b.connector;
            u = b.labelPos;
            if ((v = b.dataLabel)
                && v._pos) {
              E = v._attr.visibility, A = v.connX, z = v.connY, j = k
                  ? ["M", A + (u[6] === "left" ? 5 : -5), z,
                    "C", A, z, 2 * u[2] - u[4], 2 * u[3] - u[5], u[2], u[3],
                    "L",
                    u[4], u[5]] : ["M", A + (u[6] === "left" ? 5 : -5), z, "L",
                    u[2], u[3], "L", u[4], u[5]], i ? (i.animate(
                  {d: j}), i.attr(
                  "visibility", E)) : b.connector = i = a.chart.renderer.path(
                  j).attr({
                "stroke-width": g,
                stroke: e.connectorColor || b.color || "#606060",
                visibility: E
              }).add(a.group);
            } else if (i) {
              b.connector = i.destroy()
            }
          })
        }
      }
    },
    verifyDataLabelOverflow: function (a) {
      var b = this.center, c = this.options, d = c.center,
          e = c = c.minSize || 80, f;
      d[0] !== null ? e = q(b[2] - q(a[1], a[3]), c) : (e = q(b[2] - a[1]
          - a[3], c), b[0] += (a[3] -
          a[1]) / 2);
      d[1] !== null ? e = q(K(e, b[2] - q(a[0], a[2])), c) : (e = q(
          K(e, b[2] - a[0] - a[2]), c), b[1] += (a[0] - a[2]) / 2);
      e < b[2] ? (b[2] = e, this.translate(b), n(this.points, function (a) {
        if (a.dataLabel) {
          a.dataLabel._pos = null
        }
      }), this.drawDataLabels()) : f = !0;
      return f
    },
    placeDataLabels: function () {
      n(this.points, function (a) {
        var a = a.dataLabel, b;
        if (a) {
          (b = a._pos) ? (a.attr(a._attr), a[a.moved ? "animate" : "attr"](
              b), a.moved = !0) : a && a.attr({y: -999})
        }
      })
    },
    alignDataLabel: ta,
    drawTracker: F.prototype.drawTracker,
    drawLegendSymbol: M.prototype.drawLegendSymbol,
    getSymbol: ta
  };
  W = ea(R, W);
  aa.pie = W;
  v(Highcharts, {
    Axis: ab,
    Chart: tb,
    Color: ma,
    Legend: sb,
    Pointer: rb,
    Point: Na,
    Tick: Ja,
    Tooltip: qb,
    Renderer: Sa,
    Series: R,
    SVGElement: ra,
    SVGRenderer: Ca,
    arrayMin: Ga,
    arrayMax: pa,
    charts: Ba,
    dateFormat: Ua,
    format: wa,
    pathAnim: vb,
    getOptions: function () {
      return N
    },
    hasBidiBug: Sb,
    isTouchDevice: Mb,
    numberFormat: ua,
    seriesTypes: aa,
    setOptions: function (a) {
      N = x(N, a);
      Jb();
      return N
    },
    addEvent: J,
    removeEvent: ba,
    createElement: U,
    discardElement: Ra,
    css: L,
    each: n,
    extend: v,
    map: La,
    merge: x,
    pick: o,
    splat: ha,
    extendClass: ea,
    pInt: u,
    wrap: zb,
    svg: Z,
    canvas: $,
    vml: !Z && !$,
    product: "Highcharts",
    version: "3.0.2"
  })
})();
